如何找出当前查询计划中的“Key Lookups”?

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 消耗或已知会导致特定业务难题的查询找到要调整的查询,并调整这些计划中实际较慢的部分。

键查找并不表明性能问题,就像计划或运营商的高成本不表明性能问题一样。您需要获取实际的执行计划来找出哪些方面表现不佳。