我在應用程序的實時系統上觀察Profiler,並且看到有一條更新指令,我們定期運行(每秒)的速度非常慢。它每次花費大約400毫秒。 該查詢包括此更新(這是慢的部分)帶有索引的更新表太慢
UPDATE BufferTable
SET LrbCount = LrbCount + 1,
LrbUpdated = getdate()
WHERE LrbId = @LrbId
這是表
CREATE TABLE BufferTable(
LrbId [bigint] IDENTITY(1,1) NOT NULL,
...
LrbInserted [datetime] NOT NULL,
LrbProcessed [bit] NOT NULL,
LrbUpdated [datetime] NOT NULL,
LrbCount [tinyint] NOT NULL,
)
該表具有2個索引(非唯一的和非聚集的)與由該順序的字段:
* 的Index1 - (LrbProcessed,LrbCount)
* 索引2 - (LrbInserted,LrbCount,LrbProcessed)
當我看着這個時,我認爲這個問題來自Index1因爲LrbCount變化很大,它改變了索引中數據的順序。
但是在取消激活後index1我看到查詢與最初的時間相同。 然後我重建index1和desactivated index2,這次查詢速度非常快。
在我看來,索引2應該更新更快,數據的順序不應該改變,因爲LrbInserted時間沒有改變。
有人可以解釋爲什麼索引2是重得多更新然後索引1?
謝謝!
編輯
我才意識到我是假設錯誤的事情。
完整的查詢有另一部分負責延遲:
DECLARE @LrbId as bigint
SELECT TOP 1 @LrbId = LrbId
FROM Buffertable
WHERE LrbProcessed = 0
AND LrbCount < 5
ORDER BY LrbInserted
所以,最有可能它是從SQL引擎一個錯誤的決定上哪個索引使用有關。
對不起,我感到困惑。我想我們可以關閉這個問題。
...並且不要忘記更新您的表的統計信息,或者優化器可能會根據過時的信息選擇效率較低的路徑。這對於數據庫迅速增長或高週轉率非常重要。 – DaveE 2010-03-26 15:46:19
我對這個假設完全錯了,(我編輯了這個問題)。但更新統計數據可能很重要。 – pauloya 2010-03-26 15:59:39
@Quassnoi,順便說一下,表格有833020行。 – pauloya 2010-03-26 16:00:02