我正在查询列出当前正在执行的请求中存在的键查找,我基本上想解决这个问题,看看我是否可以从执行计划中消除这些键查找。
要获取这些键查找,我使用以下查询:
SELECT
er.session_id,
er.blocking_session_id,
er.start_time,
er.status,
dbName = DB_NAME(er.database_id),
er.wait_type,
er.wait_time,
er.last_wait_type,
er.granted_query_memory,
er.reads,
er.logical_reads,
er.writes,
er.row_count,
er.total_elapsed_time,
er.cpu_time,
er.open_transaction_count,
er.open_transaction_count,
s.text,
qp.query_plan,
logDate = CONVERT(DATETIME,GETDATE()),
logTime = CONVERT(DATETIME,GETDATE())
FROM sys.dm_exec_requests er
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) s
CROSS APPLY sys.dm_exec_query_plan(er.plan_handle) qp
WHERe er.session_id <> @@SPID
and CONVERT(VARCHAR(MAX), qp.query_plan) LIKE '%IndexScan Lookup%'
这个查询我面临的问题是它返回 anykey lookup
而不管它的成本。
我想过滤那些,我只想看到昂贵的键查找。
如何过滤我的查询以仅显示昂贵的查找操作?
这不是一个好主意。
从我这拿走。很久以前,我
sp_BlitzCache
对找到的带有 Key Lookups 的计划进行了检查,然后将该运营商的成本与计划的总成本进行了比较。如果它> 50%或其他东西,我会将其标记为昂贵的。我不会再这样做了。
问题是,成本在现实世界中具有绝对零开尔文的意义。随着查询计划中存在操作员时间,这一点变得更加明显。
修复每个 Key Lookup 不太可能解决最糟糕的性能问题,并且很可能最终会得到很多非常宽的索引。
您最好的选择是根据平均 CPU 消耗或已知会导致特定业务问题的查询来调整查询,并调整这些计划中实际速度较慢的部分。
Key Lookups 并不表示性能问题,就像计划或运营商的高成本不表示一样。您需要获取实际的执行计划以找出表现不佳的内容。
您可以使用 XQuery 过滤 XML 计划。例如:
它的作用如下:
ShowPlanXML/BatchSequence/Batch/Statements/*
的节点。*
StatementSubTreeCost
属性的值,转换为decimal
然后除以2
(您可以选择另一个计算)。RelOp
称为IndexScan
的属性Lookup
1
EstimatedTotalSubtreeCost
属性1
db<>小提琴