2011-09-13 161 views
2

這是一個非常含糊的問題,因爲我甚至不確定我在問什麼,但是尋找指導。查詢報告很長時間'鎖定'

基本上,一個系統幾周前就開始上線了。數據庫管理員給我發送了一個屏幕截圖,這個截圖是由一個名爲'Fog Light'的應用程序創建的,我相信它會監視性能。它表明,大多數存儲過程被鎖定的時間很短,大約每小時1000秒。然而,有一個報告73,000秒。

這個數字對我而言並不多。也許proc被大量使用?與其餘的相比?但是,當我們執行它時,需要4秒才能運行生產數據。不錯,考慮它在做什麼。他們的數據庫管理員說這是可以接受的,但是擔心它的鎖定持續時間的數量。

這是什麼意思?我會在哪裏開始尋找問題? proc執行5個UNION,並將結果集選擇到#temp表中。然後它對#Temp執行一個簡單的過濾器,並返回結果。

對不起,我沒有更多的信息 - 我不確定從哪裏開始尋找 - 而且..它甚至是一個問題?

+0

我還沒有使用FogLight - 據推測這是它花了時間阻止等待鎖?在這種情況下,它是否也會顯示阻擋者? –

+0

不,我所看到的只是一個過程列表,最高的一個(有問題的)過程持續時間爲73,000小時。那麼,我認爲這意味着它在過去一小時內被鎖定了(通過另一個進程,或者是更衣室?)73,000秒。 – Craig

+1

將很好地發現這份報告是否爲阻斷者或被阻止者。還要檢查你連接的是什麼隔離級別。 –

回答

0

我會做的第一件事是將以下行添加到有問題的存儲過程的頂部。

SET事務隔離級別未提交讀

嘗試篩選儘管MSDN頁面上isolation levels

一般而言,這意味着您不必等待其他交易完成。 但是這裏是READ UNCOMMITTED的亮點

指定語句可以讀取已被其他事務修改但尚未提交的行。

在READ UNCOMMITTED級別運行的事務不會發出共享鎖以防止其他事務修改當前事務讀取的數據。 READ UNCOMMITTED事務也不會被獨佔鎖阻止,這會阻止當前事務讀取已被修改但未被其他事務承諾的行。設置此選項時,可以讀取未提交的修改,這些修改稱爲髒讀。數據中的值可以更改,行可以在事務結束之前出現或消失在數據集中。此選項與在事務中的所有SELECT語句中的所有表上設置NOLOCK的效果相同。這是隔離級別最小的限制。

此外,我保證,如果你對某人說「SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED」,他們會認爲你是GENIUS。