Sql-Server

辨識數據記憶體中特定查詢的記憶體數據

  • December 16, 2016

如果可能的話,我試圖確定儲存過程記憶體的數據需要多長時間才能從記憶體中取出。

我知道有 PLE 計數器sys.dm_os_performance_counters,但我認為在我的場景中這對我沒有多大幫助。

免責聲明,所有這些都交給我來改進:

我有一個儲存過程,當由一個使用者執行時,它會將大約 250 Mb 的數據返回到記憶體中。該過程返回特定於使用者的資訊,因此使用@userID輸入參數呼叫該過程。

根據此儲存過程返回的數據(大約 3000 行),它一次顯示一行的特定於行的資訊。有一個功能,當使用者在應用程序 UI 中按下“下一步”按鈕時,它會繼續獲取結果中下一行的行特定資訊,依此類推。

由於數據已經在記憶體中,當使用單個使用者進行測試時,響應時間約為 1 秒,因為所有 250 Mb 都可以毫無問題地放入記憶體中,並且不會很快被清除。

我已經使用冷記憶體測試了該過程,執行時間約為 10 秒以返回數據。

現在,我有大約 30 個使用者在同一時間間隔內執行儲存過程,他們報告說在按下“下一步”按鈕時經歷了大約 10 秒的延遲。

令人驚訝的是,這是同一個執行官。將數據推入記憶體的時間,因為有30個使用者,所以我現在的結論是因為被推入記憶體的數據總量約為7Gb(伺服器總記憶體為16Gb),數據被推入和推出記憶體常常。

在這一點上,這只是一個理論,但我正在嘗試確定一些直接指向這個問題的指標。我知道 PLE 可能是一個指標,但有什麼可以更具體的,例如查詢。

我的建議是以更有效的方式重新編寫儲存過程,但這會花費大量時間,而且企業對為此花費時間並不是很感興趣。如果我可以用我的這個理論證明沒有辦法,那麼他們可能會允許重新編寫程序。

哦,太瘋狂了,他們對增加伺服器記憶體也不是很滿意。談論不給我選擇..

如果您的問題的目標是確定您的儲存過程是否必須進行物理讀取以滿足查詢(而不是從記憶體中檢索數據),您可以在儲存過程中使用以下查詢來擷取物理在執行期間讀取並可能保存該資訊以用於審計目的

declare @start_reads bigint
select @start_reads = reads from sys.dm_exec_requests where session_id = @@spid

-- Your query here 

select reads - @start_reads from sys.dm_exec_requests where session_id = @@spid

只是在這裡做一些簡單的數學運算,但是 250Mb 的數據大約是 31,000 頁,這意味著每一行都是從 10 頁中提取的。

當涉及到資源限制時,您只有兩個選擇:使用更少或添加更多。

在這種情況下,如果您無法添加更多記憶體,則應考慮重寫程式碼以減少返回的數據量。我會在添加記憶體之前這樣做,因為添加記憶體不會解決低效設計的問題。

低效的程式碼和設計總會在某個時候讓硬體崩潰。一年內你可能會從 30 到 300 個使用者,最好現在而不是以後看程式碼。

引用自:https://dba.stackexchange.com/questions/158351