在 Microsoft SQL Server 中建立索引, 關於「包含的資料行」

在 Microsoft SQL Server 中建立索引, 關於「包含的資料行」

在 Microsoft SQL Server 中,當建立索引時,可以使用「包含的資料行」來增強查詢效能。包含的資料行是索引的一部分,但不會用來定義索引的排序鍵。它們僅包含在索引頁面中,並且不影響索引的排序方式。這些資料行對於包含在查詢的 SELECT 列表中但不是 WHERE 或 JOIN 條件的欄位特別有用。

透過使用包含的資料行,你可以達到以下幾個目的:

  1. 覆蓋索引(Covering Index):當所有查詢需要的資料都可以從索引中獲取時,可以避免查詢需要訪問資料庫表格。這可以減少 IO 成本,提高查詢效能。
  2. 減少索引大小:索引的大小直接影響到查詢效能。通過只包含必要的資料行,可以減小索引的大小,進而提高查詢效能。
  3. 減少索引碎片:如果索引包含了大量不需要的資料行,當進行更新或插入操作時,可能會產生較多的索引碎片。只包含必要的資料行可以減少這種情況的發生。

要使用包含的資料行,可以在建立索引或修改現有索引時,使用 INCLUDE 子句指定要包含的資料行。例如:

CREATE NONCLUSTERED INDEX IX_IndexName
ON TableName (IndexedColumn)
INCLUDE (Column1, Column2, ...);
CREATE INDEX IX_IndexName
ON TableName (IndexedColumn)
INCLUDE (Column1, Column2, ...);

這樣做將指示 SQL Server 在索引中包含指定的資料行,以提高查詢效能。

若多個查詢SQL使用到同一個索引,但其 SELECT 欄位不同,可以考慮將常用的欄位作為「包含的資料行」。這樣做的好處是可以減少查詢所需的 IO 成本,提高查詢效能,尤其是當索引包含了大量不需要的資料行時。

然而,將所有欄位都設定為「包含的資料行」可能不是一個理想的做法。這會增加索引的大小,可能導致性能下降。因此,建議只包含那些經常用於查詢的欄位,以保持索引的精簡且高效。

在決定要包含哪些資料行時,可以考慮以下因素:

  1. 查詢的使用情況:分析常用的查詢,確定哪些欄位是經常被使用的。將這些欄位作為包含的資料行可能會提高查詢效能。
  2. 資料行的大小:如果某些欄位的大小較大,包含它們可能會導致索引變得龐大。因此,需要權衡包含大型欄位的好處和成本。
  3. 索引的維護成本:包含的資料行越多,索引的維護成本就越高。這可能會影響到插入、更新和刪除操作的性能。
  4. 系統整體性能:如果系統具有足夠的資源且索引大小不會對性能造成重大影響,則可以考慮包含更多的資料行。

總之,設定包含的資料行應該是一個基於實際情況的權衡過程。對於常見的查詢和使用模式,包含那些經常使用的欄位是有益的。然而,過度包含所有欄位可能會帶來不必要的性能和維護成本。

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記