在 SQL Server 中,PRIMARY KEY 與 CLUSTERED INDEX 常常被混淆。
很多人在學 SQL 時會問:
- PRIMARY KEY 一定是 CLUSTERED INDEX 嗎?
- 兩者差在哪裡?
- 在資料倉儲中應該怎麼使用?
這篇文章會用簡單方式整理兩者差異與實務應用。
Table of Contents
什麼是 Index(索引) ?
在理解 PRIMARY KEY 與 CLUSTERED INDEX前,需要先了解 Index(索引)。Index 就像書本的目錄,假設有一張資料表:
| store | product | qty |
| ----- | ------- | --- |
| A01 | P1001 | 23 |
| A01 | P1002 | 10 |
| A02 | P1001 | 5 |
如果沒有 Index,執行SQL時,資料庫會逐筆掃描整張表,這叫做:Table Scan,如果建立 Index,資料庫可以直接找到資料位置,查詢速度會快很多。:
SELECT *
FROM inventory
WHERE product = 'P1001'
什麼是 Clustered Index
Clustered Index是資料在磁碟上的實際排序方式,一張資料表只能有一個 Clustered Index,因為資料在硬碟上只能有 一種排序方式。例如:
CREATE CLUSTERED INDEX idx_inventory
ON inventory(snapshot_date, store_id, product_id)
資料可能會按照以下順序儲存:
2026-03-10 A01 P1001
2026-03-10 A01 P1002
2026-03-10 A02 P1001
2026-03-11 A01 P1001
因此進行以下查詢時,會非常快:
WHERE snapshot_date = '2026-03-10'
什麼是 Primary Key
Primary Key的用途是:唯一識別一筆資料
例如:
PRIMARY KEY (order_id)
代表:
- 不可重複
- 不可為 NULL
如果資料如下表,因為order_id是PRIMARY KEY,必須是唯一值,資料庫就會拒絕寫入。
| order_id | product |
| -------- | ------- |
| 1001 | P1 |
| 1001 | P2 |
Primary Key 與 Clustered Index 的關係
在SQL Server中,如果建立PRIMARY KEY,但沒有指定 index 類型,SQL Server 通常會自動建立CLUSTERED INDEX,例如:PRIMARY KEY (id),通常會變成PRIMARY KEY + CLUSTERED INDEX。
| 項目 | PRIMARY KEY | CLUSTERED INDEX |
|---|---|---|
| 用途 | 唯一識別資料 | 加速查詢 |
| 是否唯一 | 必須唯一 | 可以重複 |
| NULL | 不可 | 可以 |
| 數量 | 一張表 1 個 | 一張表 1 個 |
資料倉儲實務使用方式
在零售業的 BI 或 Data Warehouse 設計中,通常會這樣使用:
- Fact Table:以fact_inventory_snapshot(庫存快照)為例,通常會建立CLUSTERED INDEX
CLUSTERED INDEX (snapshot_date, store_id, product_id)
--原因:零售業的BI依賴這些欄位(日期/門市/商品)進行查詢
- Dimension Table:以dim_product(商品資訊表)為例,通常會建立PRIMARY KEY
PRIMARY KEY (product_id)
--原因:因為每個商品都是唯一的。
SQL 不需要死背
很多人在學 SQL 時會覺得SQL 語法太多,記不起來,其實 SQL 不需要死背。只需要記住三個原則:
| 原則 | 說明 |
|---|---|
| 原則1 每張表都要有 Primary Key | 確保資料可以被唯一識別。 |
| 原則2 大型資料表需要 Index | 尤其是 BI 查詢常用的欄位, 例如:date,store_id,product_id |
| 原則3 Fact Table 通常以日期做 Index | 在資料倉儲中, 大多數分析都是時間分析, Date 通常會是 Index 的第一個欄位。 |
結語
在資料庫設計中,若能清楚理解這兩個概念後,就能更好地設計資料表與資料倉儲結構,而不需要死背 SQL 語法。
PRIMARY KEY用於資料唯一識別
CLUSTERED INDEX用於提升查詢效能
很多人會以為PRIMARY KEY = CLUSTERED INDEX,但其實:
PRIMARY KEY 是「資料約束(Constraint)」
CLUSTERED INDEX 是「資料排序方式」
在 SQL Server 中:
PRIMARY KEY 預設會建立 CLUSTERED INDEX,但可以手動改成 NONCLUSTERED。
也就是說:PRIMARY KEY 與 CLUSTERED INDEX 是不同概念,只是「預設會綁在一起」。