快速注意:我們在內部運行SQL Server 2012,但問題似乎也發生在2008年和2008 R2,或許更早的一些版本。簡單的SQL查詢的性能讓我爲難,
我一直在研究我們的一些代碼性能問題,我已經找到了問題所在以下非常簡單的查詢:
SELECT min(document_id)
FROM document
WHERE document_id IN
(SELECT TOP 5000 document_id FROM document WHERE document_id > 442684)
我注意到,這個查詢需要一個荒謬當最終值(在大於)之後大約442000或更大時,長時間(在18s和70s之間,取決於運行它的機器的資源)返回。任何低於此值的查詢都會立即返回。
因爲我已經調整了查詢,看起來像這樣:
SELECT min(t.document_id)
FROM (SELECT TOP 5000 document_id FROM document WHERE document_id > 442684) t
這立即返回,我已經與測試>的所有值。
我已經解決了手頭上的性能問題,所以我非常高興,但我仍然困惑於爲什麼原始查詢對442000執行得如此糟糕,以及爲什麼它實際上快速運行的值低於(400000 ,350000等)。
任何人都可以解釋這一點嗎?
編輯:修正了第二次查詢是最小的,而不是MAX(這是一個錯字)
你應該在子查詢的'ORDER'條款運作良好,沒有它的結果不能保證每次都相同。 –