GuidまたはInt主キーのどちらを使用するのが良いですか? Guid を優先する検索結果もあれば、Int を優先する検索結果もあります。それでは、それぞれの長所と短所は実際には何ですか。
2 に答える
SQL Server の場合、INT IDENTITY
私は主キーとクラスタリング キーのほとんどに個人的に使用しています。
論理構造である主キーを区別する必要があります。行を一意に識別し、一意で安定している必要がありNOT NULL
ます。AGUID
は一意であることが保証されているため、主キーにも適しています。SQL Server レプリケーションを使用する場合は、主キーとしてAGUID
を選択することをお勧めします。その場合、とにかく一意に識別する GUID 列が必要になるためです。
SQL Serverのクラスタリング キーは、データの物理的な順序付けに使用される物理的な構成要素であり、正しく理解するのははるかに困難です。通常、 SQL Serverのインデックス作成の女王であるKimberly Tripp も、適切なクラスタリング キーが一意で、安定しており、可能な限り狭く、理想的には増加し続けることを求めています (これは aINT IDENTITY
です)。
インデックス作成に関する彼女の記事を参照してください。
- PRIMARY KEY および/またはクラスタリング キーとしての GUID
- クラスタ化インデックスの議論は続く...
- 増加し続けるクラスタリング キー - クラスタ化インデックスの議論.....再び!
- ディスク容量は安価です - それは重要ではありません
Jimmy Nilsson のThe Cost of GUIDs as Primary Keyも参照してください。
GUID は、クラスタリング キーとしては非常に不適切な選択です。これは、幅が広く、完全にランダムであるため、インデックスの断片化が悪化し、パフォーマンスが低下するためです。また、クラスター化キー行は、すべての非クラスター化 (追加) インデックスのすべてのエントリにも格納されるため、実際には小さくしておく必要があります - GUID
16 バイト対INT
4 バイトであり、いくつかクラスター化されていないインデックスと数百万行の場合、これは大きな違いになります。
SQL Server では、主キーは既定でクラスタリング キーですが、そうである必要はありません。GUID をクラスタ化されていない主キーINT IDENTITY
として、およびクラスタリング キーとして簡単に使用できます。
整数の主キーはシーケンシャルであるため (自動インクリメントを想定)、行を DB に書き込むのがより簡単になります。GUID は基本的にランダムであるため、行を挿入するとページ分割が発生し、挿入速度が低下する可能性があります。どうしても GUID を PK として使用したい場合newsequentialid
は、GUID が順番に生成されるようにする機能を検討してください。