インデックスの再構築時間は断片化レベルに依存しますか?


8

インデックスの再構築に必要な時間は、断片化のレベルに依存していますか?

80%フラグメント化されたインデックスの再構築は、40%フラグメント化された同じインデックスの再構築に1分かかる場合、約2分かかりますか?

特定の状況でどのアクションが必要かについてではなく、必要なアクションを実行するために必要となる可能性があるRUNTIME(たとえば、秒単位)を求めています。インデックスの再編成または再構築/統計の更新を行う必要がある場合の基本的なベストプラクティスを知っています。

この質問では、REORGおよびREORGとREBUILDの違いについては尋ねられません。

背景:さまざまなインデックスメンテナンスジョブ(毎晩、週末は重いジョブ)のセットアップのため、毎日の「非常に負荷の高い」オフラインインデックスメンテナンスジョブは、中程度の断片化されたインデックスでより適切に実行して、オフタイムが小さい-またはそれは問題ではなく、80%フラグメント化されたインデックスでの再構築は、40%フラグメント化された同じインデックスでの同じ操作と同じオフタイムを取る可能性があります。

私は提案に従い、何が起こっているのかを自分で見つけようとしました。私の実験的なセットアップ:他にNOTHINGを実行し、他の誰にも使用されていないテストサーバーで、いくつかの追加の列と異なるデータ型[2つの数値、9つの日時、 2 varchar(1000)]と単純に行を追加しました。提示されたテストでは、約305,000行を追加しました。

次に、更新コマンドを使用して、整数値でフィルタリングする行の範囲をランダムに更新し、文字列値を変更してVarChar列の1つを変更し、断片化を作成しました。その後、で現在のavg_fragmentation_in_percentレベルを確認しましたsys.dm_db_index_physical_stats。ベンチマークに「新しい」断片化を作成するたびに、この値を含めてこの値を追加しました。これにphysical_page_countは、次の図を構成する記録が含まれています。

それから私は走りました:そして私の録音に使用することによってAlter index ... Rebuild with (online=on); つかみましCPU timeSTATISTICS TIME ON

私の期待:私は少なくとも、断片化レベルとCPU時間の間の依存関係を示す一種の線形曲線の兆候を見ることを期待していました。

これはそうではありません。この手順が良い結果に本当に適切かどうかはわかりません。行/ページの数が少なすぎるのではないですか?

しかし、結果は、私の元の質問に対する答えが間違いなくNOになることを示しています。SQL Serverがインデックスを再構築するために必要なCPU時間は、断片化レベルにも基になるインデックスのページ数にも依存していないようです。

最初のグラフは、以前の断片化レベルと比較した、インデックスの再構築に必要なCPU時間を示しています。ご覧のとおり、平均線は比較的一定であり、断片化と必要なCPU時間の間に観察可能な関係はまったくありません。

再構築に多少の時間を必要とする可能性がある、更新後のインデックス内のページ数の変化の影響を尊重するために、FRAGMENTATION LEVEL * PAGES COUNTを計算し、必要なCPU時間の関係を示す2番目のグラフでこの値を使用しました対断片化とページ数。

インデックスの断片化とCPU時間統計の再構築

ご覧のとおり、これは、ページ数が変わっても、再構築に必要な時間がフラグメント化の影響を受けることを示していません。

これらのステートメントを作成した後、巨大で高度にフラグメント化されたインデックスを再構築するために必要なCPU時間は行の数によってのみ影響を受ける可能性があるため、手順が間違っていると思います。私はこの理論を本当に信じていません。

だから、私は本当にこれを絶対に知りたいので、それ以上のコメントや提案は大歓迎です。

回答:


2

断片化のレベルに応じて、インデックスの再構築に必要な時間はありますか?

これは、SQLサーバーが決定する主要なパラメータではなく、インデックスの再構築/再編成に時間がかかると思います。

「DATA」に基づいて関与するさまざまな他の要因があり、それを介して、どれだけの時間がかかるかを決定します。

要因1:テーブルのサイズ

要因2:可用性の懸念

要因3:パーティション化

要素4:インデックス列と一意性

これらの要素の詳細については、こちらを参照してください

同じインデックスの40%の再構築に1分かかる場合、80%の断片化されたインデックスの再構築には約2分かかりますか

もう一度答えはそれが依存することができます!数値については、シナリオをテストし、それがどのように機能するかを確認する必要があります。FRAGレベル80の場合、再構築にX時間\分\秒かかり、フラグメントレベル40の場合、再構築にY時間\分\秒かかりました。履歴を計算して保持し、15日間(スケジュールされたメンテナンスアクティビティによって異なります)を言い、実際に両方を比較するのにどれだけ時間がかかるかについて結論を出すことができます。

さらに:

インデックスの再構築の進行状況に関するデータ\計算を収集できます:

DMV sys.dm_exec_requestsまたは

OlaのRe-indexing-Re-organizingのメンテナンスプランがある場合、SQL Serverインデックスと統計のメンテナンスで説明されているように、メンテナンス中に実行されたアクションの履歴をテーブルCommandLog内に保存するオプションがあります。データが保存されたら、コマンドタイプ「ALTER_INDEX--REBUILD」と、列の開始時間と終了時間の違いをクエリできます


@KASQLDBA私はオラのCommandLogテーブルの統計/ログに入りました。期間は非常にランダムであり、認識可能な断片化レベルとは関係ありません。実稼働環境でのみこれらの値があるため、再構築に必要な時間は他のプロセスに大きく影響される可能性があり、これは一般的な答えを提供していないようです。
Magier、2015

8

興味のある方のために、私は、インデックスの断片化とページのサイズに関連して、数週間以内に約2500のインデックス再構築のインデックス再構築期間を示すグラフを作成しました。

このデータは、10のSQL Server、数百のテーブル、およびOla Hallengrenの最適化手順に基づいています。再構築の一般的なしきい値は5%の断片化に設定されています。

読みやすくするために、この統計で最大のテーブル(10 Mi +ページ)の一部を切り捨てました。

チャートは、泡のサイズとして必要な時間(期間)を示しています。最大のバブルの値は約220秒です。インデックスの再構築に必要な時間は、実際には断片化とは関係がないことを示しています。代わりに、インデックスのページ数により依存しているようです。また、低レベルのフラグメンテーションは、高レベルのフラグメンテーションよりも時間がかかることを示しています。 インデックス再構築期間

2番目のグラフは、200 Kページ以下の領域に拡大されています。同じように表示されますが、断片化が増えるのではなく、インデックスが大きいほど時間がかかります。 ここに画像の説明を入力してください


6

REBUILDインデックスはフラグメント化に依存しません。インデックスを完全に削除し、最初から作成します。

REORGANZE index-インデックスを再構築せずに断片化を減らすためのもので、ドロップや作成はありません。

MSは、30%以下の断片化にはReorganizeを使用することをお勧めします。より高い断片化には、再構築が推奨されます。

これに関するMSDNの記事は次のとおりです。インデックスの再編成と再構築

更新

操作の完了までにかかる時間に関しては、インデックスの断片化に明らかに依存します。非常に断片化されたインデックスの再構築は、再編成よりも時間がかかりません。わずかに断片化されたインデックスの再構築には、かなり時間がかかります。MSガイドラインを開始点として、テーブルでいくつかのテストを実行することをお勧めします。断片化%に関する損益分岐点は、特定のテーブル、インデックスのサイズ、およびデータのタイプによって異なります。


4

同じインデックスを40%フラグメント化した場合の再構築に1分かかる場合、80%にフラグメント化したインデックスの再構築には約2分かかりますか?

REBUILDとREORGのアルゴリズムは異なります。REORGは、REBUILDではなく新しいエクステントを割り当てません。REORGは現在割り当てられているページ(ページを移動できるように1つの8Kbランダムページを割り当てます)で動作し、必要に応じてページを移動して割り当てを解除します。

私のSQLSkills内部(以前はIE0)のメモから....

再構築の場合:

  • 複数のCPUを使用できます-並列処理を利用して作業を高速化できます。
  • 非常に断片化されたインデックス(例では80%)の場合、REBUILDはREORGよりもはるかに高速です。REBUILDはインデックスの別のコピーを作成するだけですが、REORGは断片化の削除に行き詰まるため、速度が低下します。これが、Paul Randalが、非常に断片化されたインデックスのREBUILDを実行するのが良いだろうという彼の一般的な推奨与えた理由です。
  • REBUILDを使用すると、生成するログレコードを少なくして、ログを最小限に抑えるために、リカバリモードをBULK_LOGGEDに変更できます。

インデックスREORGの場合:

  • 常にシングルスレッドです。並列処理はありません。
  • 断片化が激しいインデックスの場合は遅くなり、断片化が軽いインデックスの場合は速くなります。インデックスの作成と、断片化の軽いインデックスの再編成を行う場合のコストは大きくなるため、断片化の軽いインデックスの場合、REORGの方が高速になります。
  • REORGは常に完全にログに記録された操作です。

続きを読む- メモ-SQL Serverインデックスの断片化、タイプ、およびソリューション


金さん、TYさん、コメントをいただきましたが、私の質問の核心を監督したと思います。reorgとrebuildを比較しています。さまざまな断片化レベル(ceteris paribus)に対する再構築と再構築の比較について質問しました。
Magier、2015年

@Magierあなたが私の答えを注意深く読んだ場合、それはあなたの中心的な質問に答えます-インデックスが非常に断片化されている場合、それを再構築します。わずかに断片化されたものの再構築を行うコストは、再編成を行う場合よりもはるかに多くなります。また、再構築や再編成を行うことで断片化に対処する正しい方法や間違った方法はありません。すべて、システムの可用性、データ、インデックスサイズ、ディスクIOサブシステムなどに依存します。また、環境ごとにいくつかのテストを簡単に起動できます。異なる断片化レベルの再構築と再構築を比較します。できない?
Kin Shah、

REORGについて質問したり、言及したことはありません。それはすべて再構築についてです。そして、はい、テストをセットアップし、特定の断片化レベルを作成して、再構築にかかる時間を調べることができることを確認しましたが、そのアプローチの期待される結果を誰かがすでに知っており、その結果を伝えることができるかどうかを確認したかったのです。
Magier、2015年

3

古いスレッドであることは知っていますが、Paul Randalの投稿をここで共有することは有益だと思います。

アルゴリズム速度

断片化がない場合でも、インデックスの再構築は常に新しいインデックスを構築します。再構築にかかる時間は、インデックス内の断片化の量ではなく、インデックスのサイズに関連しています。

https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/


0

はい。通常、再構築では、行を(順番に)新しい物理インデックスパーティションにストリーミングしながら、元のインデックスを順番にスキャンする必要があります。断片化はキャッシュされていないスキャンに悪影響を与えるため、再構築にはさらに時間がかかります。

どれだけ長くかかるかは、フラグメンテーションと、CPUがプロセス全体にバインドする方法に依存します。行のシリアライズはCPUをかなり集中的に使用するため、まったく問題にならない場合があります。または、通常の1.5MB /秒のランダムIOレートを取得している可能性があり、これは高速再構築よりも簡単に5〜10倍遅くなります(スキーマとデータによって異なります)。前提条件に応じて、おそらく1倍から100倍のスローダウンが考えられます。

同じインデックスを40%フラグメント化した場合の再構築に1分かかる場合、80%にフラグメント化したインデックスの再構築には約2分かかりますか?

それは線形関係ではありません。断片化メトリックは、パーティションのスキャンにかかる時間の非常に大まかなプロキシです。


@マジェ良い研究。CPU時間は断片化の影響を受けません。メモリに完全にキャッシュされている小さなテーブルをテストしているため、読み取りIOはまったくありません。テストは無効です。より大きなテーブル(100MBなど)でCHECKPOINT; DBCC DROPCLEANBUFFERSテストし、各テストの前に行います。結果も見てみたいです。断片化に応じてスキャン速度を測定する同様のテストを一度実行しましたが、結果を覚えていません。
usr

また、実際にカウントされるのは物理ディスクヘッドの移動であるため、断片化数は緩やかな指標の一種であることにも注意してください。SQL Serverの狭い定義を使用して測定すると、適度に高速でありながら100%の断片化を伴う多くのIOパターンを想像できます。たとえば、1-4がスキャンされ、_が穴である割り当てパターン1_2_3_4は高速でなければなりません。
usr

そのとき、私は正確にどのような価値を見なければなりませんか?実際には、Rebuildから次の情報を取得しています。CPU時間= 0ミリ秒、経過時間= 70ミリ秒。テーブル 'tFrag2'。スキャンカウント4、論理読み取り512067、物理読み取り26、先読み読み取り71209、LOB論理読み取り0、LOB物理読み取り0、LOB先読み読み取り0。SQLServer実行時間:CPU時間= 8657 ms、経過時間= 27246 MS。SQL Server実行時間:CPU時間= 8657 ms、経過時間= 27386 ms。
Magier

これらの時間は3つのクエリからのものですか?少し混乱します。最初の数字から、多くのデータがキャッシュされていることがわかります。また、70msは有効なベンチマークには短すぎます。それらの数字が何を表しているのか明確にできますか?
usr

私が言及した時間はSTATISTICS_TIMEとSTATISTICS_IOから来ました。今すぐ新しいベンチマークを再開しますが、今回は適切な結果を得たいと思います。したがって、これ以上の提案は大歓迎です。データを高速に戻すことに関心があるので、データキャッシュのクリーニングが何に役立つのか理解していませんが、インデックスを再構築します。
Magier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.