2017-03-22 52 views
3

我們目前在對運行存儲過程的Web應用程序,其中一個被觸發每當特定項目的用戶搜索。不幸的是,我們有一天遇到了一個非常嚴重的問題,因爲它長期運行,因此導致數據庫性能很差。這最終給我們的應用程序帶來了很多問題。我發現了一個長時間運行的查詢通過運行該數據庫腳本導致了問題:如何控制長時間運行的查詢

SELECT sqltext.TEXT, 
req.session_id, 
req.status, 
req.command, 
req.cpu_time, 
req.total_elapsed_time 
FROM sys.dm_exec_requests req 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext 
where 
    sqltext.[Text] NOT LIKE '--''check%' 
ORDER BY req.cpu_time DESC 

所以我們做了修復,這是執行KILL [SESSION_ID],幾秒鐘我們的應用程序被打回後正常。現在,我們希望主動處理這種類型的問題,所以當我說控制時,我想知道Web應用程序是否有可能在一段時間或一段時間後優雅地終止此會話(不會導致後續問題),或者應該它是在SQL Server內部處理的?

如果有人仍然需要進一步澄清,請隨時發表評論。

+1

你需要微調的那些效果不佳的查詢,那 – TheGameiswar

+0

你在你的應用程序中使用連接超時的唯一選擇? – Vasanthan

+0

也許試試這個:http://stackoverflow.com/a/4005428/5358389 – daniell89

回答

0

你真的需要這裏 SQLTEXT [文字]不喜歡的。「 - 」「檢查%」 1.sys.dm_exec_requests也有開始時間欄,您目前沒有使用where子句。通過開始時間,所以它不會到所有數據的開始 2.查看數據並嘗試相應地修改where子句。 3.拉動proc的執行計劃,很確定它會做一個不好的表掃描。

以下是得到的執行計劃 步驟1 請修改日期,PROC數據庫名

select distinct top 1000 qs.plan_handle,o.name,d.name--,--ps.database_id 
from sys.dm_exec_query_stats qs 
    ,sys.dm_exec_procedure_stats ps 
    ,sys.objects o 
    ,sys.databases d 
where qs.last_execution_time > '2017-03-29 17:06:42.340' 
and qs.last_execution_time < '2017-03-30 18:19:45.653' 
and ps.sql_handle = qs.sql_handle 
and o.object_id = ps.object_id 
AND o.name = 'Your proc name here' 
AND d.database_id = ps.database_id 
AND d.name = 'database name ' 

步驟2 設置輸出到電網和.sqlplan 你得到一個鏈接保存步驟,如果你有足夠的權限,你可以點擊它,它會打開。確保設置了查詢輸出選項,以便爲xml輸出提供足夠的空間給 。

select query_plan 
from sys.dm_exec_query_plan (copy your handle here from step 1, do no use quotes) 
+0

我將如何執行此執行計劃? –

+0

更新答案,詳細說明如何獲得執行計劃 – Cooker