web-dev-qa-db-ja.com

代理IDキーを持つクラスター化インデックスの曲線因子の正しい値

ID主キーを持つクラスター化インデックスを持つ大きなテーブルがあります。ページ分割を最小限に抑えるために、このテーブルの曲線因子の正しい値を決定しています。断片化を測定し、適切なアクションを実行するスクリプトを毎日実行して、インデックスを維持します。テーブルには可変長の列が含まれています。

私の最初の考えは100に設定することでした(レコードはテーブルの最後にのみ書き込む必要があるため)が、可変長の列を変更するとページ分割も発生する可能性があると考えているため、現在は90に向かっています。

アドバイスをいただければ幸いです。

8
SuperCoolMoss

状況によります

それはバランスをとる行為です。テーブルが読み取り集中型で、更新や削除があまりない場合は、デフォルト(100)で問題ありません。

テーブルが非常に書き込みが多く、更新が多い場合は、80未満の値の方が適切な場合があります。

このようなものには魔法の公式はありません。 (AFAIK、ある場合はお知らせください)最善の方法は、テスト環境を用意し、テストするワークロードを用意することです。変更を加えて、データベースがワークロードでどのように機能するかを確認します。

6
Nick Kavadias

ニックはかなり正しいです。

パックされたページのレコードのサイズを増やす更新を行うと、ページ分割が発生しますが、それを除けば、IDプライマリキーを使用しても、クラスター化インデックスでページ分割は発生しません。

(とはいえ、ストレージエンジンが実行できるページ分割には5つのタイプがあり、すべてが断片化とデータ移動を引き起こすわけではありません。単調に増加するID値を挿入したときに得られるのは、ページの終わりの分割です。しかし私は逸脱します...)

私はこれで多くの顧客を支援し、そのすべてについてBOLを作成しました。価値を地面の利害関係者として選択したい場合は、70%が最も成功しています。 Nickが言うように、必要に応じて監視および調整します。

インデックスのフィルファクターを選択することは、ページのフルネスを100%に近づけるアクティビティが発生する量と、フィルファクターをリセットするための修正措置を講じることができる頻度のバランスを取る行為です。フィルファクターを50%のように非常に低く設定した場合、ページ上で最初に「無駄になる」スペースの量を考慮する必要がありますが、これが適切な場合もあります。

また、インデックスの使用方法も検討する必要があります。シングルトンルックアップの場合は、メモリ内にまばらに配置されたクラスター化されたインデックスを大量に持つことで多くのIO /メモリを浪費しないため、フィルファクターを低くし、再構築/デフラグの間隔を長くすることができます。広範囲のスキャンを実行するには、フィルファクターを少し高くして、IOとメモリ効率を向上させる必要があります。

OLTP vs DWの質問もあります-通常、DWは変更されないため、インデックスのフィルファクターは100%になります。OLTPは難しい部分です。

クラスター化インデックスを整理した後、クラスター化されていないものも断片化される可能性が高いため、注意が必要になることに注意してください。

フィルファクターをリセットするときは、再構築とデフラグのどちらかを選択できることを忘れないでください。 DBCC INDEXDEFRAG/ALTER INDEX ... REORGANIZEは、ひどく断片化されていないインデックスの場合、フィルファクターをリセットできます。

お役に立てれば!

(「過剰回答」について申し訳ありません-コードを書いた私のホットボタンの1つ:-)

8
Paul Randal