建立兩表:`Test_Guid` (PK `UNIQUEIDENTIFIER`/`VARCHAR(50)`) vs `Test_Int` (PK `IDENTITY INT`),欄位相同 (`TestId INT`, `TestText NTEXT`, `TestDateTime DATETIME`)。
-- Test_Guid
CREATE TABLE Test_Guid (
Guid VARCHAR(50) NOT NULL,
TestId INT NOT NULL,
TestText NTEXT NOT NULL,
TestDateTime DATETIME DEFAULT GETDATE(),
CONSTRAINT PK_Guid PRIMARY KEY (Guid)
);
-- Test_Int
CREATE TABLE Test_Int (
Id INT NOT NULL IDENTITY(1,1),
TestId INT NOT NULL,
TestText NTEXT NOT NULL,
TestDateTime DATETIME DEFAULT GETDATE(),
CONSTRAINT PK_Id PRIMARY KEY (Id)
);
| 維度 | INT IDENTITY | GUID (NEWID()) | GUID (NEWSEQUENTIALID()) |
|---|---|---|---|
| 儲存大小 | 4 bytes | 16 bytes (UNIQUEIDENTIFIER) / 36 bytes (VARCHAR) | 16 bytes |
| 索引深度/分頁分裂 | **遞增、極少分裂** | **隨機、嚴重分裂、碎片率高** | **遞增、低分裂** (但重啟後重置) |
| 插入效能 (單筆/批次) | **最快** | 慢 2-10x (頁分裂、記錄檔放大) | 接近 INT |
| 聯結/查詢效能 | **最佳** (窄鍵、Cache 友善) | 較慢 (寬鍵、Cache 命中率低) | 接近 INT |
| 合併/複寫/異地分散 | 需中央分配或範劃區段 | **天然全域唯一、無協調** | 同上 |
| 開發/除錯可讀性 | 直觀 (1,2,3...) | 難讀、難口述 | 難讀 |
僅能作 `DEFAULT` 約束,不可在 `SELECT`/`SET` 中直接呼叫。應用層生成有序 UUID (RFC 9562 UUID v7、ULID、TSID) 後傳入,**兼具全域唯一與插入順序**,為最佳實務。