GUIDは、SQL(特にMS SQL Server 2008)によってどのように内部的に保存および比較されますか?それは数字ですか、それとも文字列ですか?また、GUIDを主キーとして使用すると、パフォーマンスに大きな影響がありますか?
ここで説明したクラスタリングの問題に加えて: 特にパフォーマンスに関して、GUIDを主キーとして使用するためのベストプラクティスは何ですか?
128ビットの数値である必要があると思います( ここ で説明されています)が、SQLサーバーでどのように実装されているかについてのモードの詳細が見つかりません。
GUID構造 とまったく同じ16バイト:
typedef struct _GUID {
DWORD Data1;
Word Data2;
Word Data3;
BYTE Data4[8];
} GUID;
パフォーマンス面では、SQLServerの通常のGUID
はINT
よりも低速です
GUID
を使用する場合は、データ型としてuniqueidentifier
の代わりにvarchar
を使用してください。 Microsoftは、それをどのように実装するかについては言及していません。データ型としてuniqueidentifier
を使用すると、速度が最適化されます。
整数の速度を犠牲にすることなく主キーとしてGUID
を使用するには、GUID
値sequentialを作成します。 uniqueidentifier
データ型をPKとして定義し、デフォルトをNEWSEQUENTIALID()
に設定します。
詳細については、 NEWSEQUENTIALID(Transact-SQL) を参照してください。
連続するGUID
値がパフォーマンスにどのように役立つかについては、 主キーとしてのGUIDのコスト を参照してください。
Nvarchar(128)を使用することもできます。
次善のオプションはbinary(16)列です。
標準GUIDの長さは正確に16バイトです。文字列として保存する必要がある場合、長さは実際にはどのようにエンコードするかによって決まります。ハイフンのない16進数(別名基数16エンコーディング)として、32文字(1バイトあたり2桁の16進数)になります。