[MS SQL 筆記] Clustered 和 NonClustered Index 的差異
Clustered Index
索引(index)在關聯式資料庫中是一種 B-tree 資料結構,可提高查詢效率並減少查詢時間。常見的兩種索引是 Clustered Index 和 Non-Clustered Index。它們之間的主要區別在於索引的組織方式和數據存儲方式。
每個 Table 只能擁有一個 Clustered Index,它會根據索引鍵(通常是 Primary Key)的值將資料排序並存儲在相鄰的資料頁面(Page)上,同時在資料庫中創建一個 B-tree 的資料結構,以便對索引進行快速查詢。因為記錄(Records)是按照索引鍵值排序的,所以 Table 中的每一行都與索引鍵值相關聯,並在索引鍵值相同的行之間保持連續性。這種排序方式決定了整個資料表的物理排序方式。
因此,Clustered Index 的查詢速度通常比 Non-Clustered Index 更快,尤其是對於範圍的查詢,因為查詢可直接從索引中讀取資料。然而,對插入和更新操作的效能影響比較大。
Non-Clustered Index
相對於 Clustered Index,我們可以在同一個 Table 建立多個Non-Clustered Index。它可根據 Table 中的欄位(field)建立,同樣也會需要額外的空間來儲存建立的 B-tree 資料結構,且每新增一個 Non-Clustered Index,就會建立一個新的 B-tree 結構。每個索引都有自己的獨立排序方式,但不會改變資料表的物理排序方式(這個由Clustered Index決定)。
Non-Clustered Index 同樣可加速對資料表的查詢,在 Non-Clustered Index 的 B-tree 中,每個節點通常包含多個索引鍵和指向其子節點的指標,但在 Leaf-Level 上存儲了索引的最底層節點,也就是指向資料表中實際資料行的指標,而非索引鍵的值本身。這些指標通常被稱為「指向資料的指標」(Pointer to Data)。在進行查詢時,資料庫可使用 Leaf-Level 的指標來找到與索引鍵相對應的資料行,而無需繼續遍歷 B-tree。
由於 Non-Clustered Index 並沒有改變數據表中數據的物理存儲方式,因此數據表中的每一行都需要根據其指向的實際位置進行查找,對於範圍的查詢,NonClustered Index 性能較差,但是它能夠提供比 Clustered Index 更好的插入、更新和刪除性能。
此外,當資料表上建立多個Non-Clustered index時,這些索引所需的空間可能會變得相當大。資料庫管理員可能需要定期進行索引維護,以確保資料庫保持在最佳狀態。
總而言之,Clustered Index 和 Non-Clustered Index 都是加速查詢的有用工具,但它們之間的主要差異在於它們在數據表上建立的位置以及對數據排序方式的影響。在實際使用中,Clustered Index 通常用於主鍵或唯一性約束,而NonClustered Index 則用於其他需要查詢的欄位(field)。
參考:
[食譜好菜] Clustered Index 與 Non-Clustered Index 不同之處 | 軟體主廚的程式料理廚房 — 點部落 (dotblogs.com.tw)