sql >> データベース >  >> RDS >> Sqlserver

クラスター化インデックスを追加/削除せずに SQL Server テーブルの断片化を減らしますか?

    問題

    これは一般的な問題であり、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 の断片化を修正します。



    1. SQL Serverで「datetime2」を「smalldatetime」に変換します(T-SQLの例)

    2. OracleDataPumpエクスポートファイル内のスキーマを決定する方法

    3. 注意:CREATELANGUAGEパラメーターの代わりにpg_pltemplate情報を使用する

    4. AndroidAppとMySqlConnectionが機能しませんでしたconnection.open