在 SQL Server 中,PRIMARY KEY 與 CLUSTERED INDEX 常常被混淆。
很多人在學 SQL 時會問:
- PRIMARY KEY 一定是 CLUSTERED INDEX 嗎?
- 兩者差在哪裡?
- 在資料倉儲中應該怎麼使用?
這篇文章會用簡單方式整理兩者差異與實務應用。
目錄
什麼是 Index
在理解 PRIMARY KEY 與 CLUSTERED INDEX前,需要先了解 Index(索引)。
Index 就像書本的 目錄,假設有一張資料表:
| store | product | qty |
| ----- | ------- | --- |
| A01 | P1001 | 23 |
| A01 | P1002 | 10 |
| A02 | P1001 | 5 |
SELECT *
FROM inventory
WHERE product = 'P1001'
資料庫會:逐筆掃描整張表,這叫做:Table Scan,如果建立 Index,資料庫可以直接找到資料位置,查詢速度會快很多。
什麼是 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 差異比較
資料倉儲實務使用方式
在零售業的 BI 或 Data Warehouse 設計中,通常會這樣使用:
- Fact Table:以fact_inventory_snapshot(庫存快照)為例,通常會建立CLUSTERED INDEX
- Dimension Table:以dim_product(商品資訊表)為例,通常會建立PRIMARY KEY
CLUSTERED INDEX (snapshot_date, store_id, product_id)原因:零售業的BI依賴這些欄位(日期/門市/商品)進行查詢
PRIMARY KEY (product_id)原因:因為每個商品都是唯一的。
零售資料倉儲範例
一個簡單的零售 Data Warehouse 可能包含以下資料表:
warehouse.fact_sales
warehouse.fact_inventory_snapshot
...
warehouse.dim_product
warehouse.dim_store
warehouse.dim_date
其中fact_inventory_snapshot,通常會建立:
CLUSTERED INDEX(snapshot_date, store_id, product_id)
SQL 不需要死背
很多人在學 SQL 時會覺得SQL 語法太多,記不起來,其實 SQL 不需要死背。
只需要記住三個原則:
結語
在資料庫設計中,若能清楚理解這兩個概念後,就能更好地設計資料表與資料倉儲結構,而不需要死背 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 是不同概念,只是「預設會綁在一起」。