Sql-Server
SSMS 儀表板報告中的 GrantedQueryMemory(KB) 值不正確
只是檢查一下是否有其他人目睹了同樣的情況並嘗試了修復或已修復:
問題:
stackoverflow2013
我在數據庫上執行以下查詢select ParentId as [Post Link], count(id) from posts where posttypeid = 2 and len(body) <= 200 and (body like '%hank%') group by parentid having count(id) > 1 order by count(id) desc;
並且在檢查 GrantedQueryMemory 的 SSMS 儀表板報告時,該值顯示大約 62 GB,這在從 dmv 收集相同值時似乎不正確
從 dmv 顯示 62 MB
在我看來它像一個錯誤,所以在這里報告
使用 XE 擷取儀表板正在執行的查詢,它只是從
sys.dm_exec_requests
. 這是查詢:exec sp_executesql @stmt=N' SELECT master.dbo.fn_varbintohexstr(sql_handle) AS sql_handle, master.dbo.fn_varbintohexstr(plan_handle) AS plan_handle, case when LEN(qt.text) < 2048 then qt.text else LEFT(qt.text, 2048) + N''...'' end as query_text, r.session_id, r.request_id, r.start_time, r.status, r.statement_start_offset, r.statement_end_offset, r.database_id, r.blocking_session_id, r.wait_type, r.wait_time, r.wait_resource, r.last_wait_type, r.open_transaction_count, r.open_resultset_count, r.transaction_id, r.cpu_time, r.total_elapsed_time, r.scheduler_id, r.reads, r.writes, r.logical_reads, r.transaction_isolation_level, r.granted_query_memory, r.executing_managed_code FROM sys.dm_exec_requests AS r JOIN sys.dm_exec_sessions s on r.session_id = s.session_id outer APPLY msdb.sys.dm_exec_sql_text(sql_handle) as qt WHERE s.is_user_process = CASE when @include_system_processes > 0 THEN s.is_user_process ELSE 1 END',@params=N'@include_system_processes Bit',@include_system_processes=0
注意
r.granted_query_memory
選擇中的 ,沒有對其執行乘法或除法。請注意,此數字實際上是以頁為單位的。 當我執行您的查詢時,我得到這些不同的數字:
sys.dm_exec_requests.granted_query_memory
= 1,464 頁(乘以每頁 8KB = 11,712 KB)sys.dm_exec_query_stats.last_grant_kb
= 11,712 千字節- 性能儀表板 = 11,993,088“千字節”
這正是授予的字節數 (11,712 * 1,024 = 11,993,088)。
因此,這裡的錯誤似乎在 SSMS 使用者界面程式碼中,而不是在查詢中,因為它從查詢中返回 1,464,然後必須乘以 8(從頁面轉換為 KB),然後乘以 1,024(從KB 到字節)。很好的電話報告給微軟。
我最近在 Query Store 報告中向 Microsoft 報告了完全相同類型的計算問題,該報告記錄在此問答中:What is ‘Log Memory’ in Query Store 2017。似乎是一個常見問題=)