web-dev-qa-db-ja.com

SQL Serverでインデックスを再構築および再編成する必要があるのはなぜですか

インターネットを検索した後、私は理由を見つけることができませんでした

  1. SQL Serverでインデックスを再構築および再編成する必要があるのはなぜですか?

  2. 再構築して再編成すると、内部で何が起こりますか?

site に関する記事はこう言っています:

インデックスの断片化が40%を超える場合、インデックスを再構築する必要があります。インデックスの断片化が10%から40%の間の場合、インデックスを再編成する必要があります。インデックスの再構築プロセスはより多くのCPUを使用し、データベースリソースをロックします。 SQL Server開発バージョンとEnterpriseバージョンには、ONLINEオプションがあり、Indexが再構築されるときにオンにすることができます。 ONLINEオプションは、再構築中もインデックスを使用できるようにします。

これを理解することはできませんでしたが、これを行うにはWHENとありますが、WHYについて知りたいのですが、インデックスを再構築して再編成する必要がありますか?

28
Mourya

挿入の更新と削除を実行すると、インデックスは内部と外部の両方で断片化されます。

内部断片化とは、インデックスページに高い割合の空き領域があることです。つまり、SQL Serverは、インデックスをスキャンするときに、より多くのページを読み取る必要があります。

外部の断片化とは、インデックスのページが適切な順序でなくなったときであり、SQL Serverは、特にIO用語でインデックスを読み取るために、より多くの作業を行う必要があります。

インデックスの断片化が進みすぎると、クエリの効率は悪くなりますが、最悪の場合、SQL Serverはインデックスの使用をすべて停止するため、事実上すべてのクエリでテーブルスキャンまたはクラスター化インデックススキャンを実行する必要があります。これはパフォーマンスに大きな影響を与えます。

インデックスを再編成すると、SQL Serverは既存のインデックスページを使用し、それらの期間でデータをシャッフルします。これにより、内部の断片化が緩和され、少量の外部の断片化を取り除くこともできます。これは、再構築よりも軽量で、常にオンラインです。

インデックスを再構築すると、SQL Serverは実際にはインデックスのデータを再ソートし、新しい一連のインデックスページを使用します。これは明らかに内部と外部の両方の断片化を軽減しますが、より重い操作であり、デフォルトではインデックスがオフラインになりますが、SQL Serverのバージョンと設定によってはオンライン操作として実行できます。

ただし、再構築後の断片化が0になるとは期待しないでください。 MAXDOPクエリヒントを使用しない限り、SQL Serverは再構築操作を並列化し、関連するプロセッサが多いほど、各プロセッサまたはコアがインデックスのセクションまたはフラグメントを個別に再構築するため、断片化が発生する可能性が高くなります。お互い。これは、最適な断片化レベルとインデックスの再構築にかかる時間の間のトレードオフです。断片化が0に近い場合は、MAXDOP 1を使用して、結果をTempDBで並べ替えます。

29
Pete Carter

データベースレベルの低速化/長時間実行されるクエリなどの問題を引き起こす断片化を削除するため。

断片化の詳細と、インデックスの再構築と再編成(またはインデックスページの再編成)の仕組みについて詳しくは、以下のリンクを参照してください。 https://www.idera.com/productssolutions/sqlserver/sqldefragmanager/what-is-fragmentation