GUIDは、主キーの自然な選択のように思われるかもしれません。本当に必要な場合は、テーブルの主キーにGUIDを使用することを主張することもできます。特に指定しない限り、GUID列をクラスタリングキーとして使用することを強くお勧めします。これは、SQLServerがデフォルトで使用します。
あなたは本当に2つの問題を区別する必要があります:
1)主キーは論理構造であり、テーブル内のすべての行を一意かつ確実に識別する候補キーの1つです。これは何でもかまいません。実際には、INT、GUID、文字列など、シナリオに最も適したものを選択してください。
2)クラスタリングキー(テーブルの「クラスター化インデックス」を定義する1つまたは複数の列)-これは物理ストレージ関連のものであり、ここでは、小さく、安定した、増え続けるデータ型が最適です-INTまたはデフォルトオプションとしてBIGINT。
デフォルトでは、SQL Serverテーブルの主キーはクラスタリングキーとしても使用されますが、そのようにする必要はありません。以前のGUIDベースのプライマリ/クラスター化キーを2つの別個のキー(GUIDのプライマリ(論理)キーと別個のINT IDENTITY(1,1)
列のクラスター化(順序付け)キー)に分割すると、個人的に大幅なパフォーマンスの向上が見られました。
キンバリー・トリップ(インデックス作成の女王)などが何度も述べているようGUID
に、クラスタリングキーは最適ではありません。ランダムであるため、ページとインデックスの断片化が大きくなり、一般的にパフォーマンスが低下するためです。
はい、私は知っnewsequentialid()
ています-SQL Server 2005以降にあります-しかし、それでも完全にシーケンシャルではないため、-と同じ問題が発生しますGUID
-少し目立たないほどです。
次に、考慮すべき別の問題があります。テーブルのクラスタリングキーは、テーブルのすべての非クラスター化インデックスのすべてのエントリにも追加されます。したがって、可能な限り小さいことを確認する必要があります。通常、テーブルの大部分には2億行以上のINTで十分です。また、クラスタリングキーとしてのGUIDと比較すると、ディスクとサーバーメモリに数百メガバイトのストレージを節約できます。
迅速な計算-プライマリキーおよびクラスタリングキーとしてINTとGUIDを使用:
- 1'000'000行のベーステーブル(3.8MB対15.26MB)
- 6つの非クラスター化インデックス(22.89MB対91.55MB)
合計:25MB対106MB-そしてそれはただ1つのテーブルにあります!
もう少し考えてみてください-キンバリー・トリップの素晴らしいもの-読んで、もう一度読んで、消化してください!これは、SQLServerのインデックス作成の福音です。
マーク