2016-03-16 34 views
0

查詢:SQL服務器沒有使用頂級+訂單指數由

SELECT TOP 10 
    [Trade_US_PC].[ID] 
FROM 
    [Trade_US_PC] 
INNER JOIN 
    [Item] ON ([Trade_US_PC].[ItemID] = [Item].[ID]) 
WHERE 
    ([Trade_US_PC].[ItemTraitsID] = 14) 
ORDER BY 
    [Item].Name_EN 
  • Trade_US_PC.IDItem.ID是主鍵
  • [Trade_US_PC].[ItemID]Item.ID外鍵和被索引CREATE INDEX IX_Trade_US_PC_ItemID ON Trade_US_PC(ItemID);
  • [Trade_US_PC].[ItemTraitsID]是另一個表上的可空列外鍵,並且是空間索引CREATE NONCLUSTERED INDEX FTIX_Trade_US_PC_ItemTraitID ON Trade_US_PC(ItemTraitsID) WHERE ItemTraitsID IS NOT NULL;
  • Item.Name_EN被索引CREATE INDEX IX_Item_Name_EN ON Item(Name_EN)

問題是,執行Top 10order by當查詢未使用Name_EN索引。

enter image description here

我能做些什麼來擺脫昂貴的前N個排序的?

+0

你爲什麼覺得它很慢?讀數的數量是多少(「SET STATISTICS IO ON」)?查詢計劃時間總是必須使其所有操作總計達到總執行時間的100%,因此某個地方總是有很高的百分比,但這並不意味着該部分效率不高或速度慢。 – Igor

+0

@Igor我的表超過了40萬行,查詢甚至在5分鐘內無法完成。 – Steve

+1

如果您刪除了ORDER BY,那麼持續時間是多少?還有從SET STATISTICS IO ON讀取的結果是什麼(對讀取和掃描感興趣)。你也可以提供DDL嗎? – Igor

回答

0

檢查索引碎片上的索引IX_Item_Name_EN。如果這是非常分散的,它可以解釋執行計劃的結果以及執行所需的時間。如果它嚴重分散,你可以重建它,這應該顯着加快查詢速度(如果它被分割)。

1

需要注意的是排序操作是很重要的一個阻塞操作,這解釋了性價比很高的,它在你的聲明消耗,你需要知道的另一件事是事實,<>運營商禁止使用任何指標,因爲這是一個不過濾的操作(不是謂詞),因爲它永遠不會利用索引(聚簇或非聚簇)的優勢。

您可以使用您的分析查詢下一個語句來評價不同的指標:

SET STATISTICS IO 
SET STATISTICS TIME