2012-11-21 66 views
7

我在SQL Server 2005數據庫中訂購性能時遇到問題。 可以說我有以下查詢:SQL Server 2005在索引掃描之前進行全表排序

select 
    id, versionId, orderIndex 
from Forms_Page 
where 
    versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E' 
order by 
    orderIndex 

這個查詢將返回7行,並採取〜23日秒鐘的執行。該查詢的執行計劃如下(無法發佈圖像):

select(cost:0%) - > Sort(cost:11%) - > Clustered Index Scan(cost:89%)

如果我刪除'order by'子句,查詢將在〜4ms內完成,就像預期的那樣。

爲什麼SQL Server在獲取請求的行之前進行排序?這對我沒有意義。爲什麼不先獲得7行並僅對這些行進行排序?我是否缺少某些東西,比如數據庫配置,還是這是一種預期的行爲?

我可以使用內部選擇,如下所示,強制引擎首先獲取行,然後進行排序,這將在〜6 ms內返回行,但由於我們使用的是EF,因此這不會是對我們來說是一個很好的解決方案(我們可以在內存中對結果進行排序,但是我們使用LoadWith選項來生成SQL代碼的一些實體,並且這些代碼也受到'order by'問題的困擾)。

select * 
from(
    select 
     id, versionId, orderIndex 
    from Forms_Page 
    where 
     versionId = 'AFCF4921-31B4-44C1-B3A7-913910F7600E' 
) T 
order by 
    T.orderIndex 

我測試了一些索引是排序的列,它固定的東西,但只是因爲列已經排序。看起來像一個笨重的解決方案...

+0

的聚集索引掃描步驟的順序 - >排序 - >選擇。選擇你看到的是最後一步,這正好給出了預期的輸出。 (並且輸出應該被排序)並且在計劃中,「更大的任務」估計是索引掃描而不是排序。你確定沒有執行計劃的順序使用相同的索引來掃描嗎? –

+0

是的,它使用相同的索引,因爲它只是我剛纔意識到的一點,就是對於簡單的搜索,它使用IMPLICIT_CONVERT將字符串轉換爲唯一標識符,而按順序使用{guid,'AFCF4921- 31B4-44C1-B3A7-913910F7600E'}。 我做了一些測試與轉換和轉換,我不斷獲得相同的時間。 –

+0

VersionId是唯一密鑰嗎?或者你可以重複嗎?如果它是獨一無二的,我會期待這會更快。 –

回答

1

首先,我不知道它爲什麼這樣做!話雖如此,以下是您可能已經嘗試過的一些事情。

最後,也許你的情況不相關,但有表的一個很好的解釋暗示這裏:http://blog.sqlauthority.com/2009/11/19/sql-server-understanding-table-hints-with-examples/

+0

可悲的是,沒有一個工作,甚至與提示,我不認爲有可能告訴實體框架使用它們,據我所知。 –

+0

這非常奇怪! 我只是重新運行EXEC sp_updatestats而不是它工作正常。奇怪的是它第一次沒用!但重要的是現在正在工作! 感謝您的幫助! –

+0

這是奇怪的,但很酷,它最終成功了。如果它第一次不起作用,我會記錄兩次更新統計信息;-) –

相關問題