2017-08-10 134 views
0

我對SQL Server優化和索引的世界比較陌生。我運行了一個查詢,建議缺少索引(https://blog.sqlauthority.com/2011/01/03/sql-server-2008-missing-index-script-download/),並且我無法理解Include子句的差異。SQL Server非集羣索引 - 包含值

我的兩個索引唯一的區別是Index1包含'電子郵件'列和Index2不。這兩個指標是必需的還是會足夠的?我相信只有Index1是必要的,但我不確定。

CREATE INDEX [Index1] 
ON [ActiveDirectory].[dbo].[ActiveDirectory] ([MailEnabled], [Active]) 
INCLUDE ([EmployeeID], [DisplayName], [Email]) 


CREATE INDEX [Index2] 
ON [ActiveDirectory].[dbo].[ActiveDirectory] ([MailEnabled], [Active]) 
INCLUDE ([EmployeeID], [DisplayName]) 

謝謝!

Griz

+0

什麼類型,並在值範圍MailEnabled和Active? –

回答

0

這取決於你在select語句 需要做哪些列。如果你需要所有三個[EmployeeID], [DisplayName], [Email] - 創建Index1

否則,創建Index2

大致 - 您在WHERE使用的字段謂詞應該位於索引的ON部分,並且您在SELECT中使用的列應該在'INCLUDE'中(如果它們未在ON中提及)

爲例

同時兩個指數見Creating Indexes with Included Columns,是最絕對 - 不需要

基本上,索引的INCLUDE部分中的列不參與索引結構,而是附加到索引,因此您不必返回到表中並通過PK查找數據。

您可以通過ON子句中的列有效「查找」:[MailEnabled], [Active],並且您可以將它們包含在select中,而無需額外成本。

您也能在不增加成本[EmployeeID], [DisplayName], [Email]來選擇你的INCLUDE子句中的列 - 但是搜索(過濾,連接,查找)他們不會那麼快

0

只需要第一個索引。

如果你有兩個建議,這是因爲一個查詢需要所有三個包含列('覆蓋索引')滿足查詢,而無需查詢主聚簇索引以獲取列......並且第二個查詢只需要其中的兩個。

一個包含所有三個列的索引滿足兩個查詢。

嘗試創建兩者都會創建大量重複數據,並且會減慢插入次數並且無法正確使用更多磁盤空間。

相關問題