0

SQL Server 2005でインデックスを最適化しようとしましたが、何も機能しないようです。ウィザードを使用して複数のメンテナンスプランを作成しましたが、ジョブは常に失敗します。私はこのサイトからスクリプトを実行しました。これは元々Microsoftからのものです。

http://blog.sqlauthority.com/2008/03/04/sql-server-2005-a-simple-way-to-defragment-all-indexes-in-a-database-that-is-fragmented-above- a-宣言されたしきい値/

オブジェクトエクスプローラーで特定のテーブルに移動し、[インデックス]フォルダーを選択して[再構築]を選択しても、正常に完了したと報告されていても、すべてのフラグメンテーション%は変更されません。

再構築されたインデックスの断片化は0%であるべきではありませんか?もしそうなら、なぜこのSQLは機能しないのでしょうか:

ALTER INDEX [IndexName] ON [dbo].[TableName] 
REBUILD WITH ( PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = Off,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, SORT_IN_TEMPDB = OFF, ONLINE = OFF )

これは、選択したRebuildIndexによって生成されたSQLです。

4

2 に答える 2

0

テーブルに多くの行がない場合、またはデータが1ページのデータ(8k)を消費しない場合は、再構築した後でもインデックスの断片化に気付くでしょう。

于 2009-11-05T14:02:35.863 に答える
0

他の応答で示唆されているように、非常に小さなデータベースに関連している可能性がありますが、問題はFILLFACTORに関連している可能性が高くなります。

示されているALTERINDEXステートメントはFILLFACTORについて明示的に言及していないため、再構築は現在のfillfactor値に基づいて行われ、この係数に近似する断片化が残ります。(特定のインデックスエントリを2つのノードに分割できないため、完全に一致することはめったにありません。したがって、各ノードにフィルファクタが必要とするよりも多くのまたは少ないスペースが残る可能性があります。実際、場合によっては、これには小数のバイト数が必要になります。 。しかし、実際の問題から逸脱しないようにしましょう...)

SELECT * FROM sys.indexes WHERE object_id IN(SELECT object_id FROM sys.objects WHERE name ='myTableName')のようなクエリを使用して、sys.indexesテーブルを調べることにより、特定のインデックスの現在のフィルファクタ値を照会できます。

または、示されているALTER INDEXの変更バージョンを実行すると、「WITH」オプションに... FILLFACTOR = 100 ...が追加され、報告された断片化が期待に一致すると思われます。

わかりやすくするために、PAD_INDEXオプションは、インデックスの中間ノードにスペースを残すようにSQLに指示するだけです。したがって、これらには「断片化」は発生しませんが、リーフノードには発生します。

これは... 新しいデータがテーブルに挿入されるときに断片化の開始を遅らせるために、一定量のフィルファクターを残すことをお勧めします。

于 2009-11-05T14:58:36.520 に答える