Câu hỏi DMV SQL Server 2008 R2


7

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.

nhập mô tả hình ảnh ở đây

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.

nhập mô tả hình ảnh ở đây

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?

Câu trả lời:


8
use dbx;
select foo
from db1.dbo.table
join db2.dbo.table on condition
where some_function();

Truy vấn này tiêu tốn rất nhiều CPU và yêu cầu cấp bộ nhớ lớn. Trong cơ sở dữ liệu nào? Thông tin bạn muốn đơn giản không tồn tại như một khái niệm. Là một người có kiến ​​thức sâu sắc và có lợi ích lớn, bạn có thể giải thích được tại sao 75% CPU là do db1 và 15% là do db2. Nhưng cuối cùng bạn chỉ có thể gán truy vấn cho cơ sở dữ liệu. Thực tế là một số truy vấn (ok, hầu hết) được chứa 100% bên trong một db không có nghĩa là tất cả các tài nguyên truy vấn có thể được gán một cách xác định cho một db.

Tuy nhiên, đối với các phương tiện thực tế tương đối đơn giản để tự động hóa chính xác những gì bạn đã làm trong bài đăng của mình: kiểm tra các kế hoạch và xác định tất cả các vị trí của toán tử truy cập vật lý và sử dụng thông tin này để gán tài nguyên truy vấn cho DB.

with xmlnamespaces (default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan')
select x.value(N'@NodeId',N'int') as NodeId
    , x.value(N'@PhysicalOp', N'sysname') as PhysicalOp
    , x.value(N'@LogicalOp', N'sysname') as LogicalOp
    , ox.value(N'@Database',N'sysname') as [Database]
    , ox.value(N'@Schema',N'sysname') as [Schema]
    , ox.value(N'@Table',N'sysname') as [Table]
    , ox.value(N'@Index',N'sysname') as [Index]
    , ox.value(N'@IndexKind',N'sysname') as [IndexKind]
    , x.value(N'@EstimateRows', N'float') as EstimateRows
    , x.value(N'@EstimateIO', N'float') as EstimateIO
    , x.value(N'@EstimateCPU', N'float') as EstimateCPU
    , x.value(N'@AvgRowSize', N'float') as AvgRowSize
    , x.value(N'@TableCardinality', N'float') as TableCardinality
    , x.value(N'@EstimatedTotalSubtreeCost', N'float') as EstimatedTotalSubtreeCost
    , x.value(N'@Parallel', N'tinyint') as DOP
    , x.value(N'@EstimateRebinds', N'float') as EstimateRebinds
    , x.value(N'@EstimateRewinds', N'float') as EstimateRewinds
    , st.*
    , pl.query_plan
from sys.dm_exec_query_stats as st
cross apply sys.dm_exec_query_plan (st.plan_handle) as pl
cross apply pl.query_plan.nodes('//RelOp[./*/Object/@Database]') as op(x)
cross apply op.x.nodes('./*/Object') as ob(ox)

Rất đẹp, đó là những gì tôi đang tìm kiếm. Cảm ơn bạn đã hỗ trợ nhanh chóng.
Craig Efrein
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.