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

SQL Server インデックス クラスタ化する必要があるのはどれですか?

    Frederik はそれをうまくまとめており、それはまさに Kimberly Tripp も説いていることです:クラスタリング キーは安定し (決して変化せず)、常に増加し (IDENTITY INT)、小さくてユニークでなければなりません。

    あなたのシナリオでは、クラスタリング キーを VARCHAR(80) 列ではなく BIGINT 列に配置したいと思います。

    まず第一に、BIGINT 列を使用すると、一意性を強制するのはかなり簡単です (一意性を自分で強制および保証しない場合、SQL Server は 4 バイトの "uniquefier" をすべての行に追加します)。平均して VARCHAR(80) よりも小さいです。

    なぜサイズがそれほど重要なのですか?クラスタリング キーは、EACH とすべての非クラスター化インデックスにも追加されます。そのため、多数の行と多数の非クラスター化インデックスがある場合、8 バイトに対して 40 ~ 80 バイトを使用すると、すぐに巨大になります。違い。

    また、もう 1 つのパフォーマンスのヒント:いわゆるブックマーク ルックアップ (クラスター化キーを介して非クラスター化インデックスの値から実際のデータ リーフ ページへ) を回避するために、SQL Server 2005 では「含まれる列」の概念が導入されました。非クラスター化インデックスで。これらは非常に役に立ちますが、見過ごされがちです。クエリでインデックス フィールドと、データベースの 1 つまたは 2 つの他のフィールドが必要になることが多い場合は、「カバー インデックス」と呼ばれるものを実現するためにそれらを含めることを検討してください。繰り返しになりますが、Kimberly Tripp の優れた記事を参照してください。彼女は SQL Server のインデックス作成の女神です。 :-) そして、彼女は私よりずっとうまく説明できます...

    要約すると、クラスタリング キーを小さく安定した一意の列に配置すると、問題なく実行できます!

    マーク



    1. 特定の列が更新されたときにのみトリガーを実行する方法(SQL Server)

    2. Azureでサーバーを作成し、その上でphp、mysqlサイトをホストする方法

    3. RubyMysqlクエリで変数を使用する

    4. MYSQL選択クエリが0行を返す場合、別の選択クエリ?