2013-01-22 60 views
2

我使用SQL Server 2012的爲什麼有些列減慢查詢

我試圖優化查詢是服用點是這樣的:

SELECT TOP 20 ta.id, 
       ta.name, 
       ta.amt, 
       tb.id, 
       tb.name, 
       tc.name, 
       tc.id, 
       tc.descr 
FROM a ta 
     INNER JOIN b tb 
       ON ta.id = tb.id 
     INNER JOIN c tc 
       ON tb.id = tc.id 
ORDER BY ta.mytime DESC 

查詢約需5 - 6秒跑步。連接中使用的所有列都有索引。這些表格有500k條記錄。

我的問題是:當我從select中刪除列tc.name,tc.id和tc.descr時,查詢以小於1秒的時間返回結果。爲什麼?

+2

因爲您要從'JOIN'中刪除整個表。你應該從最大的表格開始,然後'加入'到更小的表格。 – Kermit

+0

經常寫'c'嗎? – MikeSmithDev

+0

如果您使用的是SQL Management Studio,則可以運行優化程序來查看執行計劃。這可能會提供一些洞察,究竟是什麼問題:http://www.simple-talk.com/sql/sql-training/the-sql-server-query-optimizer/ – Wade

回答

0

我終於可以通過向表中添加額外的索引來調整查詢。 SQL服務器沒有顯示/暗示缺少索引,但我通過在選擇中出現的字段上創建新的非聚集索引來計算出來。

感謝大家前來尋求幫助。

@包含鏈接對理解SQL優化器有幫助

0

您需要發佈執行計劃才能真正知道差異。

據我所知,SQL Server確實不是優化掉連接。畢竟,即使在選擇列表中沒有列,連接仍然可以用於過濾和乘以行數。

但是,可能會跳過一個步驟。通過select中的變量,引擎需要同時轉到索引以獲取包含數據的頁面。沒有這些變量,引擎就不需要執行提取操作。這可能巧妙地將優化器的平衡從一種類型的連接轉移到另一種連接類型。

第二種可能性只涉及計時。如果您運行一次查詢,則可能會在計算機上填充頁面緩存。第二次運行它時,僅僅因爲數據在內存中而使查詢更快。除非您(1)清除每次調用之間的緩存或(2)確保緩存等效填充,否則永遠不要運行計時。