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

在 SQL Server 中,PRIMARY KEY 與 CLUSTERED INDEX 常常被混淆。
很多人在學 SQL 時會問:

  • PRIMARY KEY 一定是 CLUSTERED INDEX 嗎?
  • 兩者差在哪裡?
  • 在資料倉儲中應該怎麼使用?

這篇文章會用簡單方式整理兩者差異與實務應用。

目錄

    什麼是 Index


    在理解 PRIMARY KEYCLUSTERED INDEX前,需要先了解 Index(索引)

    Index 就像書本的 目錄,假設有一張資料表:

      
            | store | product | qty | 
            | ----- | ------- | --- | 
            | A01   | P1001   | 23  | 
            | A01   | P1002   | 10  | 
            | A02   | P1001   | 5   | 
        
    如果沒有 Index,執行sql時:
    
    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 差異比較

    項目 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) 

      原因:因為每個商品都是唯一的。

    零售資料倉儲範例


    一個簡單的零售 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 不需要死背。
    只需要記住三個原則:

    原則 說明

    原則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 是不同概念,只是「預設會綁在一起」。