Posted in

[SQL] PRIMARY KEY 與 CLUSTERED INDEX 差別與使用時機(資料倉儲設計筆記)

資料科學

在 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   | 
   

如果沒有 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 KEYCLUSTERED 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 是不同概念,只是「預設會綁在一起」。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *