問題
これは一般的な問題であり、SQL Server を使用するすべての企業にとって深刻な問題であるため、明確にしておきましょう。
この問題と CREATE CLUSTERED INDEX の必要性は誤解されています。
永続的なクラスター化インデックスを持つことは、持たないよりも優れていることに同意しました。しかし、それは要点ではなく、とにかく長い議論につながるので、それは脇に置いて、投稿された質問に焦点を当てましょう.
要点は、ヒープにかなりの断片化があるということです .あなたはそれを「テーブル」と呼んでいますが、物理的なデータ ストレージまたは DataStructure レベルにはそのようなものはありません。テーブルは論理的な概念であり、物理的な概念ではありません。これは、物理的な DataStructures のコレクションです。コレクションは次の 2 つの可能性のいずれかです:
- <リ>
ヒープ
すべての非クラスター化インデックスに加えて
テキスト/画像チェーンに加えて
または クラスタ化インデックス
(ヒープと 1 を削除します 非クラスター化インデックス)
すべての非クラスター化インデックスに加えて
テキスト/イメージ チェーンに加えて。
ヒープがひどく断片化されます。散在する (ランダムな) 挿入/削除/更新が多いほど、断片化が進みます。
ヒープをそのままクリーンアップする方法はありません。 MS は機能を提供していません (他のベンダーが提供しています)。
解決策
ただし、Create Clustered Index は、ヒープを完全に書き換えて並べ替えることがわかっています。したがって、方法 (トリックではありません) は、ヒープのデフラグのみを目的としてクラスター化インデックスを作成することです。 、その後ドロップします。 table_size x 1.25 の db の空き容量が必要です。
その際は、必ず FILLFACTOR を使用して 未来 を減らしてください 断片化。その後、ヒープはより多くの割り当てられたスペースを使用し、更新による将来の挿入、削除、および行の拡張を可能にします。
注意
<オール> <リ>3 つの レベル があることに注意してください 断片化の;これは、レベル III のみを扱います。ヒープ内の断片化は、クラスター化インデックスの欠如によって引き起こされます
<リ>別のタスクとして、別の機会に、断片化を完全に排除する永続的なクラスター化インデックスの実装を検討することをお勧めしますが、それは投稿された問題とは別のものです。
コメントへの返信
そうではありません。それを「限界」とは言いません。
<オール> <リ>ヒープ内の断片化を解消するために私が示した方法は、クラスター化されたインデックスを作成し、それを削除することです。 すなわち。一時的に、その唯一の目的は断片化を修正することです.
<リ>全体を削減するため、テーブルにクラスター化インデックスを (永続的に) 実装することは、はるかに優れたソリューションです。 断片化 (DataStructure は引き続き断片化される可能性があります。以下のリンクの詳細情報を参照してください)。これは、ヒープで発生する断片化よりもはるかに少ないです。
- <リ>
リレーショナル データベースのすべてのテーブル (「パイプ」テーブルまたは「キュー」テーブルを除く) には、さまざまな利点を活用するために、クラスター化インデックスが必要です。
<リ>クラスター化インデックスは、データを分散する列に配置する必要があります (INSERT の競合を回避します)。レコード ID など、単調に増加する列にインデックスを作成しないでください。これにより、最後のページに INSERT ホット スポットが保証されます。
MS SQL と Sybase ASE には、3 つのレベルがあります。 断片化、および各レベル内で、いくつかの異なるタイプ .断片化を扱うときは、テーブルではなく DataStructures に注目する必要があることに注意してください (上記で説明したように、テーブルは DataStructures のコレクションです)。レベルは次のとおりです:
- <リ>
レベル I • Extra-DataStructure
関係する DataStructure の外側、データベース全体またはデータベース内。
レベル II • データ構造
関連する DataStructure 内で、ページの上 (すべてのページにわたって)
これは、DBA が最も頻繁に対処するレベルです。
レベル III • ページ
関係する DataStructure 内、ページ内
これらのリンクは、断片化に関する完全な詳細を提供します。これらは Sybase ASE に固有のものですが、構造レベルでは、情報は MS SQL に適用されます。
- <リ>
<リ>
<リ>
私が示した方法はレベル II であることに注意してください。これは、レベル II および III の断片化を修正します。