web-dev-qa-db-ja.com

SQL Serverデータベースでインデックスをどのくらいの頻度で再構築する必要がありますか?

現在、データベースのサイズは10 GBで、1か月あたり約3 GB増加しています。クエリの実行時間を改善するために、インデックスを時々再構築する必要があるとよく耳にします。それで、与えられたシナリオでどのくらいの頻度でインデックスを再構築する必要がありますか?

32
HotTester

インデックスの断片化が5(場合によっては10%)を超えたらすぐにインデックスを再編成(「デフラグ」)する必要があるという一般的なコンセンサスがあり、30%を超えたら完全に再構築する必要があります(少なくともそれは私が持っている数値です)多くの場所で提唱されていると聞きました)。

Michelle Ufford(別名 "SQL Fool")には 自動インデックスデフラグスクリプト があり、インデックスを再編成または再構築するタイミングを決定するためにこれらの正確な制限を使用します。

インデックスの再構築に関するブラッド・マクギー氏のヒント も参照してください。インデックスの再構築に対処するためのヒントとヒントがいくつかあります。


私はここでこのスクリプトを使用して(これをいつ取得したか思い出せません-だれでも:本当にありがとう!本当に役立つものです)、特定のデータベースのすべてのインデックスのインデックスの断片化を表示します。

SELECT 
    t.NAME 'Table name',
    i.NAME 'Index name',
    ips.index_type_desc,
    ips.alloc_unit_type_desc,
    ips.index_depth,
    ips.index_level,
    ips.avg_fragmentation_in_percent,
    ips.fragment_count,
    ips.avg_fragment_size_in_pages,
    ips.page_count,
    ips.avg_page_space_used_in_percent,
    ips.record_count,
    ips.ghost_record_count,
    ips.Version_ghost_record_count,
    ips.min_record_size_in_bytes,
    ips.max_record_size_in_bytes,
    ips.avg_record_size_in_bytes,
    ips.forwarded_record_count
FROM 
    sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN  
    sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN  
    sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
    AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
    AVG_FRAGMENTATION_IN_PERCENT, fragment_count
39
marc_s

「必要なとき」と「できるとき」!

例えば...

  • 最初に断片化をテストし、何もしないか、再編成するか、再構築するかを決定します。 SQL Foolのスクリプトがこれを行います 、たとえば、@minFragmentationおよび@rebuildThreshold パラメーター

  • たとえば、毎日統計を行いますが、週末にインデックスを作成します。あなたのメンテナンスウィンドウは何ですか?

5
gbn

インデックスの劣化によって本番環境が悪影響を受けないように、インデックスを頻繁に再構築する必要があります。これは曖昧に思えますが、すべてのデータベースは異なり、使用方法も異なります。書き込み操作(挿入/更新)が発生するインデックスを定期的に再構築/デフラグする必要があるだけです。静的なテーブルまたはほとんど読み取り専用のテーブルでは、インデックスの再作成はそれほど必要ありません。

dbcc showcontig([Table])を使用してインデックスの断片化レベルを確認し、断片化の頻度と実際の断片化のレベルを確認する必要があります。

dbcc dbreindex([Table])を使用して、インデックスが断片化しすぎた場合(20%〜30%程度)にインデックスを完全に再構築しますが、十分なダウンタイムウィンドウが見つからず、断片化レベルが比較的低い(1%-25 %)、「オンライン」モードでインデックスをデフラグするには、dbcc indexdefrag([Database], [Table], [Index])を使用する必要があります。また、インデックスデフラグ操作を停止して、作業を失うことなく後で再開できることにも注意してください。

データベースとそのインデックスを「調整して」保持するには、少し監視して、いつ、何を再インデックスするかを実際に感じます。

2
NTDLS

データベースのサイズを考えると、月に1回簡単にインデックスを再構築できます。しかし、サイズが約500 GBに増加すると、月に2回実行できます。

1
Coder