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