GUIDは主キーの自然な選択のように思えるかもしれませんが、本当に必要な場合は、テーブルの主キーにGUIDを使用するように主張することができます。特にお勧めしない限り、SQLサーバーはデフォルトでGUID列をクラスタリングキーとして使用しないことを強くお勧めします。
あなたは本当に2つの問題を分けておく必要があります:
主キーは、一意かつ確実に、テーブル内のすべての行を識別すること、候補キーのいずれか-論理的構築物です。これは本当に何でもかまいません。INT
、GUID
文字列が-あなたのシナリオのための最も理にかなっているものを選びます。
クラスタ化キー(表の「クラスタ化インデックス」を定義する列または列) -これは、物理 -ストレージ関連のもの、そしてここで、小型、安定した、増え続けるデータ型は、あなたの最高のピックであるINT
か、BIGINT
あなたのようデフォルトのオプション。
デフォルトでは、SQL Serverテーブルの主キーはクラスタリングキーとしても使用されますが、そのようにする必要はありません。以前のGUIDベースのプライマリ/クラスター化キーを2つの別々のキーに分割すると、パフォーマンスが大幅に向上します。GUIDのプライマリ(論理)キーと、別のINT IDENTITY(1,1)
列のクラスター化(順序)キーです。
以下のようキンバリーメーカーTripp -インデックスの女王-などが非常に多くの時間を述べている- GUID
クラスタリング・キーは、そのランダム性に起因しているため、最適ではないとして、それは大規模なページとインデックスの断片に、一般的に悪いパフォーマンスにつながります。
はい、知っています-あります newsequentialid()
ています。SQLServer 2005以降にもありますが、それでも完全にシーケンシャルではなく、したがって、同じ問題がGUID
-それほど顕著ではありません。
次に、考慮すべき別の問題があります。テーブルのクラスタリングキーは、テーブルのすべての非クラスタ化インデックスのすべてのエントリにも追加されます。したがって、できるだけ小さくする必要があります。通常、INT
20億行以上の行があれば、ほとんどのテーブルで十分です。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のインデックス作成の福音です。
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)
基本的には、PRIMARY KEY
制約であることを明示的に伝える必要がありますNONCLUSTERED
(そうでない場合は、デフォルトでクラスター化インデックスとして作成されます)。次に、次のように定義されている2番目のインデックスを作成します。CLUSTERED
これは機能します-パフォーマンスのために「再設計」する必要がある既存のシステムがある場合、これは有効なオプションです。新しいシステムの場合、ゼロから始めて、レプリケーションシナリオでない場合は、常にID INT IDENTITY(1,1)
クラスター化された主キーとして選択します-何よりもはるかに効率的です!