2010-02-09 164 views
1

全部,SQL查詢運行緩慢或DBCC DBReindex或Alter索引後卡住

SQL 2005 sp3,數據庫大小約70gb。偶爾,當我重新索引我所有表格中的所有索引時,前端似乎會凍結或運行速度非常緩慢。這些是來自前端的查詢,而不是sql server中的存儲過程。前端使用JTDS JDBC連接來訪問SQL Server。如果我們停止並重新啓動發送查詢的Web服務,問題似乎就消失了。我的理解是,我們有一個連接池,在該連接池中,我們重新使用連接,並且不會每次建立新的連接。

每次我們重新編制索引時,都不會發生這個問題。我用dbcc dbreindex和alter index online = on嘗試了兩種方法,並在tempdb = on中進行排序。

任何有關此問題發生的原因以及如何防止此問題的任何洞察將是非常有用的。

由於提前,

加里雅培

回答

1

當發生這種情況下一次,看看sys.dm_exec_requests看到什麼阻止來自客戶端的請求。 blocking_session_id將指示誰阻塞,並且wait_type和wait_resource將指示阻塞的內容。您也可以使用Activity Monitor達到相同的效果。

在預先生成的數據庫上,聯機索引重建不會阻止正常的活動9選擇/插入/更新/刪除)。由於在線索引重建,服務器上的負載可能會增加,這可能會導致整體響應速度變慢,但不應導致阻塞。

如果數據庫未預先增長,索引重建的額外分配將觸發數據庫增長事件,如果以10%的增量保留默認值並且未啓用instant file initialisation,則該事件可能非常緩慢。在數據庫增長事件期間,所有活動都會凍結在該數據庫中,即使索引是在線重建的,這也可能是您的問題。同樣,活動監視器和sys.dm_exec_requests都會清楚地表明這種情況正在發生。

+0

我看過阻塞,這些查詢沒有被阻止,它們處於掛起狀態。我是一個非常積極主動的數據庫架構師,我有足夠的空間來重新編制數據和日誌文件。現在這裏是一個令人無法接受的轉折,我被告知他們有5個線程打開,只有4個被凍結,一個線程仍在工作。 我相信,當使用JDBC連接進行索引重建期間線程仍處於活動狀態時,它可能無法在刪除索引或重建索引之後識別查詢計劃。有沒有辦法更好地處理這些JDBC連接? – DanceswithLightning 2010-02-09 19:18:07

+0

Suspended仍然會在sys.dm_exec_requests中的wait_type和wait_resource中顯示掛起原因。他們是什麼?關於查詢計劃:當索引重建開始時,它會提升索引的元數據版本,這將使所有現有計劃失效。新的查詢必須重新編譯並生成一個新計劃(因爲新計劃必須更新舊索引和在線的在建工程)。但所有這些都是由服務器處理的,客戶端沒有理由阻止。 – 2010-02-09 19:31:24

+0

我沒有看待等待類型,下次我會。我懷疑現有的JDBC連接正在進行表掃描,這將導致性能下降。有沒有更好的方法來處理現有的JDBC連接?即使在線修改索引時,也會使查詢計劃失效?感謝您的洞察力。 – DanceswithLightning 2010-02-09 20:11:41