2011-04-07 230 views
4

我在SQL Server 2005上的一個非常小的表(< 10行,5列)上運行一個非常簡單的查詢,通常它會立即返回結果,但有時需要很長時間才能完成(如5-10s)。我知道,我們的服務器負載很重,這可能是原因(因爲我不認爲它可能會發生,因爲鎖 - 沒有人寫入該表) - 但我需要以某種方式找到瓶頸。SQL查詢在隨機時間很長

關於如何才能找到確切的服務器資源,這使得這樣簡單的查詢運行這麼久的任何建議?

+0

您可以監視SQL Server正在使用的客戶端連接數嗎?也許某些最大限制正在受到打擊,所以傳入的客戶端連接必須等待現有連接才能獲得釋放,通過超時。 – 2011-04-07 13:59:53

+0

你發現了什麼是瓶頸嗎? – broadband 2015-11-19 18:15:36

回答

1

你需要的唯一東西就是分析。您需要了解內存,輸入/輸出和處理器。您需要知道這三個中的哪一個導致服務器變慢。有很多產品可以做到這一點(甚至還有一個安裝了Windows的性能監視器)。

不要「想」它,你需要看到數據以瞭解基本問題。

4

在SSMS中,在對象資源管理器中右鍵單擊連接的服務器,然後選擇活動監視器。

在那裏您可以看到最近昂貴的查詢和其他性能數據。

1

您不需要寫入表中就可以鎖定它。您可以嘗試修改其中一條SELECT語句以使用WITH (NOLOCK)另一個非常緩慢並且加入到此表中的語句(插入/更新/刪除)可能會鎖定它。

+0

你是什麼意思的另一個查詢,使加入到這張表。如果您只對此表執行選擇語句,則不會被鎖定。沒有鎖定獲得。 – broadband 2015-11-19 18:12:12

+0

編輯我的答案以「語句」替換「查詢」一詞。謝謝。 – openshac 2015-11-21 16:11:05

4

除了運行探查,並檢查page life expectancybuffer cache hit ratio參見:Use sys.dm_os_performance_counters to get your Buffer cache hit ratio and Page life expectancy counters

它也可以(但你必須測試)是什麼情況是,你正在尋找得到了圈外的數據在RAM緩存,現在它已經從磁盤獲取它,這將需要更長的時間,當你以後再運行它第二次將再次快速

您可以通過統計運行檢查IO ON

SET STATISTICS IO ON 

select * ..your query 

你應該看到類似的東西

Table'TableNAme'。掃描計數1,邏輯讀取4,物理由從RAM丟棄數據讀取2

如果看到physical reads高於0,它抓住它從磁盤

可以驗證這一點(未生產)

DBCC freeproccache 
DBCC DROPcleanbuffers 

現在當你運行一個查詢兩次,你會看到這樣的事情,第一次運行時會從盤,第二從RAM

Table'TableNAme'。掃描計數1,邏輯讀取4,物理讀取2

表'TableNAme'。掃描計數1,邏輯讀取4,物理讀取0