Mar*_*lli 2 index sql-server execution-plan index-tuning query-performance
我正在放置一个查询来列出当前正在执行的请求中存在的关键查找,我基本上想解决这个问题,看看是否可以从执行计划中消除这些关键查找。
为了获取这些键查找,我使用以下查询:
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%'
Run Code Online (Sandbox Code Playgroud)
我在这个查询中面临的问题是它返回任何,无论其成本key lookup如何。
我想过滤那些,我只想看到昂贵的关键查找。
如何过滤查询以仅显示昂贵的查找操作?
Eri*_*ing 12
从我这拿走。很久以前,我编写了一个检查代码,找到sp_BlitzCache包含关键查找的计划,然后将该运营商的成本与计划的总成本进行比较。如果它> 50% 或其他什么,我会把它标记为昂贵的。
我不会再这样做了。
问题是,成本在现实世界中的开尔文意义绝对为零。随着查询计划中存在操作员时间,这一点变得更加明显。
四处修复每个键查找不太可能解决最糟糕的性能问题,并且很可能最终会得到很多非常宽的索引。
更好的选择是根据平均 CPU 消耗或已知会导致特定业务难题的查询找到要调整的查询,并调整这些计划中实际较慢的部分。
键查找并不表明性能问题,就像计划或运营商的高成本不表明性能问题一样。您需要获取实际的执行计划来找出哪些方面表现不佳。