我在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
我測試了一些索引是排序的列,它固定的東西,但只是因爲列已經排序。看起來像一個笨重的解決方案...
的聚集索引掃描步驟的順序 - >排序 - >選擇。選擇你看到的是最後一步,這正好給出了預期的輸出。 (並且輸出應該被排序)並且在計劃中,「更大的任務」估計是索引掃描而不是排序。你確定沒有執行計劃的順序使用相同的索引來掃描嗎? –
是的,它使用相同的索引,因爲它只是我剛纔意識到的一點,就是對於簡單的搜索,它使用IMPLICIT_CONVERT將字符串轉換爲唯一標識符,而按順序使用{guid,'AFCF4921- 31B4-44C1-B3A7-913910F7600E'}。 我做了一些測試與轉換和轉換,我不斷獲得相同的時間。 –
VersionId是唯一密鑰嗎?或者你可以重複嗎?如果它是獨一無二的,我會期待這會更快。 –