GUID は主キーの自然な選択のように思われるかもしれません。どうしても必要な場合は、テーブルの PRIMARY KEY に GUID を使用することをお勧めします。特に使用しないように指示しない限り、SQL Server はデフォルトでこれを行います。
2 つの問題を区別する必要があります。
主キーは論理構造であり、テーブル内のすべての行を一意かつ確実に識別する候補キーの 1 つです。これは、実際には何でもかまいません - INT
、 a GUID
、文字列 - あなたのシナリオにとって最も意味のあるものを選んでください。
クラスタリング キー(テーブルの「クラスター化インデックス」を定義する列または列) - これは物理ストレージに関連するものであり、ここでは、小さくて安定した、増え続けるデータ型が最善の選択INT
ですBIGINT
。デフォルトのオプション。
デフォルトでは、SQL Server テーブルの主キーはクラスタリング キーとしても使用されますが、そうである必要はありません。以前の GUID ベースのプライマリ/クラスター化キーを、GUID のプライマリ (論理) キーと別のINT IDENTITY(1,1)
列のクラスター化 (順序付け) キーの 2 つの個別のキーに分割すると、パフォーマンスが大幅に向上することを個人的に見てきました。
インデックス作成の女王であるKimberly Trippや他の人が何度も述べているGUID
ように、クラスター化キーは最適ではありません。これは、そのランダム性が原因で、大量のページとインデックスの断片化が発生し、一般的にパフォーマンスが低下するためです。
はい、私は知っnewsequentialid()
ています-SQL Server 2005以降にあります-しかし、それでさえ真に完全にシーケンシャルではなく、したがって、と同じ問題に苦しんでいますGUID
-少し目立たないだけです.
次に、考慮すべき別の問題があります。テーブルのクラスター化キーは、テーブルのすべての非クラスター化インデックスのすべてのエントリにも追加されるため、できるだけ小さくする必要があります。通常、INT
大多数のテーブルには 20 億行以上の で十分ですGUID
。クラスタリング キーと比較すると、ディスク上およびサーバー メモリ内のストレージを数百メガバイト節約できます。
クイック計算 - INT
vs.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 のインデックス作成の福音です。
PS: もちろん、数百または数千の行を扱っている場合、これらの引数のほとんどは実際にはあまり影響しません。ただし、数万または数十万の行に入ったり、数百万を数え始めたりすると、それらの点が非常に重要になり、理解することが非常に重要になります。
更新:PKGUID
列を主キー (クラスタリング キーではなく) として使用し、別の列MYINT
( INT IDENTITY
) をクラスタリング キーとして使用する場合は、次を使用します。
CREATE TABLE dbo.MyTable
(PKGUID UNIQUEIDENTIFIER NOT NULL,
MyINT INT IDENTITY(1,1) NOT NULL,
.... add more columns as needed ...... )
ALTER TABLE dbo.MyTable
ADD CONSTRAINT PK_MyTable
PRIMARY KEY NONCLUSTERED (PKGUID)
CREATE UNIQUE CLUSTERED INDEX CIX_MyTable ON dbo.MyTable(MyINT)
基本的には、それが制約であることを明示的に伝える必要があります(それ以外の場合は、既定でクラスター化インデックスとして作成されます)。次に、次のように定義された 2 番目のインデックスを作成します。PRIMARY KEY
NONCLUSTERED
CLUSTERED
これは機能します。パフォーマンスのために「再設計」する必要がある既存のシステムがある場合、これは有効なオプションです。新しいシステムの場合、ゼロから開始し、レプリケーション シナリオを使用していない場合はID INT IDENTITY(1,1)
、クラスター化された主キーとして常に選択します。他の何よりも効率的です!