SAN環境でSQLインデックスを最適化することに利点はありますか?


16

SQLサーバーはSAN上にあります。多数のOLTPデータベースが含まれており、一部には1m以上のレコードを含むいくつかのテーブルがあります。

私たちは、実行されているオラHallengrenの索引メンテナンススクリプトを毎週、そしてそれは、数時間ごとに実行されます。断片化のしきい値に基づいて、スクリプトはインデックスを再編成または再インデックス化します。インデックスの再作成中にログファイルが膨大になり、ログ配布中に帯域幅が過剰に消費されることが確認されています。

次に、ブレント・オザールからの記事があります。彼はSQLインデックスについて心配するのをやめると言っています

ハードドライブは、同時にドライブリクエストを行っている他のサーバーと共有されるため、ドライブは常にデータを取得するためにあらゆる場所でジャンプします。インデックスの最適化は、無意味な忙しい作業です。

この質問をググリングすると、さまざまな意見につながりますが、ほとんどが短すぎるか弱すぎると思われる議論でサポートされています。暫定的な計画では、メンテナンススクリプトの断片化のしきい値を調整して、インデックスの再作成よりもはるかに頻繁に再編成するようにします。

最終的な判定は何ですか?毎週のメンテナンスジョブの実行に伴う負担を考慮して、SANでSQLインデックスを最適化することは価値がありますか?

回答:


10

最適化戦略は、ディスクとの間のスキャン速度を向上させるのに役立ちます。

さまざまな意見は、環境の理想的な最適化戦略が多くの異なる要因に依存するためです。また、断片化の潜在的なレイヤーが複数存在します。

データベースがSANに保存されていると言うだけでは十分な情報ではありません。例えば:

  • データベースファイルは個別の物理RAIDグループまたは同じRAIDグループに保存されていますか?同じデバイスでアクティブな他のプロセスは何ですか?バックアップファイルもそこにありますか?常に透過的ではないため、SAN管理者にこの情報を要求する必要がある場合があります。

  • データベースのアクセスパターンは何ですか?OLTPは一般にランダムアクセスですが、アプリケーションがテーブルスキャンに対応していて、動作を変更できない場合もあります(ISVアプリ)。アプリケーションは、ほとんど読み取りますか、ほとんど書き込みますか、またはその中間ですか?

  • 回復/フェールオーバー期間中パフォーマンスSLAが使用されていますか?

Brentの投稿では、ストレージの巨大なプールが1つあり、すべてがそれを共有すると想定しています。つまり、物理ディスクがアイドル状態になることはほとんどないため、ほとんどのアクセスはランダムです。それがあなたの状況である場合、アドバイスが適用され、ほとんどの部分でそれに同意します。この種の戦略は管理がはるかに簡単ですが、必ずしも(a)環境にあるもの、または(b)環境に最適なソリューションであるとは限りません。

インデックスのメンテナンスが面倒な場合は、あまり積極的に行わないことを検討するか、1週間にわたってコストを償却します(つまり、週に1回の重いメンテナンスではなく、1日1回の軽いメンテナンスを実行します)。

SortInTempdbオプションをオンにして、ユーザーデータベースで発生するログの量を潜在的に減らすこともできます。


うわー、徹底的な答え。私がすべての研究を行うにはおそらく時間がかかるでしょうが、あなたが私を正しい方向に導いてくれることを疑いません。実際、私たちの現在の戦略は、再構築と再編成の両方の観点から保守をあまり積極的に実行しないことです。そこから、あなたが言及した残りの要因についてさらに調査します。
-dev_etter

1
@dev_etter:いくつかの要素のみをリストしました。さらにたくさんあります。要点は最初の文です。環境を考えているときにそれを念頭に置いておくと、あなたの決定を正しく導きます。すべてはそれから生じます。(また、これはすべてSSDが関与していないことを前提としています。)
ジョンセイゲル

FWIW、私は何かを完全に見落としていました-ジョブステップの実際のスクリプト(ソースではなく)は、最小フラ​​グメンテーションパーセンテージが1であるすべてのインデックスに対応するように構成されていました。 35に。ジョブは8時間ではなく3時間強で実行されるようになりました。積極的でないという提案は正しかったです。私のせいは、その仕事は既にそれほど積極的ではないと考えられていたという事実にありました。このアプローチはおそらく私たちにとって最適であり、まだ触れて行くだけですが、すでにいくつかの痛みを軽減しました。
-dev_etter

@JonSeigelこの答えには完全に同意します。旅行中、ほとんどのDBAが単一のプール、または少なくとも同じRAIDレベルのアレイを共有しているのを目にします。100TB以上のデータベースの個々のファイルグループをデフラグするために、24時間365日午前3時にDBAを利用しました... ディスクのIOは完全にランダムであり、遅延は15ミリ秒でした。その時点で、15msをポイントし、開発者に私を放置するように指示する必要があります。
アウトワイヤ

2

理想的には、注意が必要なインデックスのみを再編成/再インデックスする必要があります。そうしないと、リソースを浪費し、他の問題を引き起こす可能性があります。

パフォーマンスのベースラインを確立する必要があり、変更を加えるたびに、パフォーマンスの変化をベースラインと比較して、変更が実装する価値があるかどうかを判断します。


私たちの当面の戦略は、まさにそれを行うことです-このスクリプトのminFragmentationおよびrebuildThreshold変数の設定を調整します。sqlfool.com/ 2011/06 / index
defrag

0

さて、質問はデータベースインデックスについてです。データベースインデックスは、ファイルまたはファイルのセットの構造です。上記の答えを読むと、ファイル内のインデックスではなく、ディスクレベルでの断片化について話していると信じるようになります。これらはまったく別の主題です。

ここでの近視的なアプローチは、インデックスをデフラグまたは再構築すると、内部のデータを取得するときのパフォーマンスが向上し、OLTPデータベースが向上します。答えはイエスです!ただし、ディスクの断片化も要因であることに注意することが重要です。

全体的に最も低い「コスト」ですか?データベースのメンテナンスを行います。2番目に低いコスト、データベースのデタッチ、別の場所への移動、ディスクの再フォーマット、ディスクパーティションの配置のベストプラクティスhttp://msdn.microsoft.com/en-us/library/dd758814.aspx。最後になりましたが、Diskkeeperのようなサードパーティの高度なデフラグツールを使用してください。

これはNTFSタイプのストレージ(Windows OSなど)にのみ推奨されるものであり、これはどの製品も推奨するものではなく、Condusiv Technologiesまたはその子会社と提携しているわけでもありません。


2
「答えはイエスです!」と断言するのは避けたいでしょう。他のポスターによって長々と議論されてきた問題空間へ。Brent Ozarが彼のブログ投稿で示したように、答えが「はい」である場合もあるかもしれませんが、常にそうであるとは限りません。
マックスヴァーノン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.