Tôi có một truy vấn để truy xuất 10 truy vấn hàng đầu dựa trên tổng số lần đọc logic từ dV_exec_query_stats DMV.
SELECT TOP 10
SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
db_name(qt.dbid) as db_name,
qs.execution_count,
qs.total_logical_reads,
qs.total_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
SUBSTRING(CONVERT(varchar(19),qs.last_execution_time),1,19)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC
Truy vấn trả về tất cả các thông tin được yêu cầu, ngoại trừ tên của cơ sở dữ liệu mà truy vấn đến từ hoặc được hướng đến. Cho dù tôi sử dụng dm_exec_sql bản hay dm_exec_query_plan thì kết quả vẫn như nhau.
db_name (qt.dbid) là db_name dm_exec_sql bản
hoặc là
db_name (qp.dbid) là db_name dm_exec_query_plan
Cả hai trả về NULL hoặc tempdb làm tên cơ sở dữ liệu.
Vấn đề tương tự xảy ra khi chọn Báo cáo -> Truy vấn hiệu suất hàng đầu theo IO trung bình.
Tên cơ sở dữ liệu trống.
Tuy nhiên, nếu tôi thêm kế hoạch truy vấn vào truy vấn, và sau đó mở kế hoạch truy vấn trong SSMS, tôi có thể thấy tên của cơ sở dữ liệu ban đầu bằng cách di chuột qua các tìm kiếm Index, Quét hoặc RID khác nhau.
Tôi đã nhận thấy rằng có một số cơ sở dữ liệu được tham chiếu trong kế hoạch truy vấn, chẳng hạn như mssqlsystemresource cùng với cơ sở dữ liệu trackit
Nếu kế hoạch truy vấn có thể hiển thị tên của cơ sở dữ liệu hoặc cơ sở dữ liệu bị ảnh hưởng bởi truy vấn trong danh sách top 10 của tôi, thì lý do là tôi sẽ có thể lấy tên của các cơ sở dữ liệu đó bằng DMV.
Làm cách nào tôi có thể sửa đổi 10 truy vấn hàng đầu để truy xuất tên của cơ sở dữ liệu cho mỗi truy vấn?
Hoặc có cách nào tốt hơn để có được 10 truy vấn hàng đầu theo cách sử dụng CPU / IO / Bộ nhớ và lấy tên hoặc tên cơ sở dữ liệu cho mỗi trong số 10 truy vấn hàng đầu?