簡體   English   中英

SQL Server 中的復合索引和覆蓋索引

[英]Composite Index and Covering Index in SQL Server

我有一個表(ID,col1,col2)和查詢

SELECT ID FROM table WHERE col1 = 2
AND col2 = 7

我應該創建一個復合索引

CREATE NONCLUSTERED INDEX IDX_Composite ON table (ID, col1, col2)

或覆蓋指數

CREATE NONCLUSTERED INDEX IDX_Covering ON table ID INCLUDED (col1, col2)

您問題中的兩個索引都不會幫助您進行查詢。 這樣做的原因是因為第一個排序列是ID ,但是,您的過濾列位於col1col2上; 因此,索引並不能幫助數據引擎快速查找您需要的行。

讓我們把你所擁有的東西放入一個經典的電話簿類比中。 假設ID是電話號碼, Col1是姓氏, Col2是名字。 如果我們使用您的索引,電話電話簿是按電話號碼排序的,從“最低”電話號碼開始,到“最高”電話號碼結束。 如果您想要名為“John Smith”的人的電話號碼,您唯一的選擇是通讀本書並找到每個 John Smith。

然而,傳統的電話簿是按姓氏排序,然后是名字,並在它們旁邊有每個人的電話號碼。 這意味着您現在可以輕松解決“John Smith 的電話號碼是多少”的問題? 翻閱這本書,首先是“Smith”,然后是“John”,然后你就有了所有的電話號碼。

因此,您的索引應該如下所示:

CREATE NONCLUSTERED INDEX IX_Composite ON table (col1, col2) INCLUDE (ID);

正如 Charlieface 所指出的,如果您的列ID是您的聚集索引,那么實際上不需要INCLUDE它; 聚集索引中的列會自動INCLUDE在任何NONCLUSTERED索引中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM