2009-03-06 63 views
2

我已經在SQL Server 2005下非常大的表:如何正確地創建一個索引

create table Blah 
(
    FirstName varchar(30), 
    Rank int, 
    Position int, 
    ... 
) 

我會在其上運行以下查詢:

declare @PassedInFirstName varchar(30) 
set @PassedInFirstName = 'SomeName' 

select TOP 1 Position 
from Blah 
where FirstName = @PassedInFirstName 
order by Rank DESC 

我設立以下指數上:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank) 

考慮到我的排名倒序它,我應該改變該指數下降的方式進行排序:

CREATE INDEX IX_Blah ON Blah (FirstName ASC, Rank DESC) 

或者沒關係?

謝謝。

回答

3

如果WHERE返回。如果應受益許多行。

我已經看到了結果,其中邏輯IO減少了50%,通過在索引使用DESC以匹配ORDER BY

此外,查詢更改爲覆蓋:

SQL 2005 +:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC) INCLUDE (Position) 

SQL 2000,SQL 7:

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC, Position) 
+0

+1爲覆蓋件 – AngryHacker 2009-03-06 05:49:58

2

在索引中添加Rank作爲降序值只是一個小的改變。 Sql Server可以可能反向排序使用,或在這種情況下,輕鬆迭代到列表中的最後一個項目。

是你的主要關鍵?索引由索引列,主鍵和可選的包含列構建而成。如果職位不是您的主鍵,那麼您目前正在您的索引中查找您的主鍵,然後使用主索引查找結果以查找職位價值。嘗試將Position值添加爲包含列,並且您應該能夠僅基於一個索引執行查詢,而不會使用其他索引。

CREATE INDEX IX_Blah ON Blah (FirstName, Rank DESC) INCLUDE (Position) 

不要忘記檢查你的查詢計劃,他們可以告訴你,如果你沒有任何索引(假設SQL Server 2008中),使用什麼索引等

+0

這裏沒有涉及主鍵,也沒有任何列是唯一的。 – AngryHacker 2009-03-06 05:51:15

0

我搞砸了驗證我的前面p ost,這是我的註冊用戶。

索引基於您選擇的列和主鍵。你基本上存儲了一個hashmap,其中鍵(FirstName,Rank)解析爲你的Id(假設你的主鍵是Id)。這個Id然後用於讀取位置值。

我的建議是將位置值包含在索引中作爲包含列。這將允許您從索引讀取數據,避免第二次查找。