【问题标题】:I am trying to tune a SQL query to get better performance我正在尝试调整 SQL 查询以获得更好的性能
【发布时间】:2020-04-06 19:44:12
【问题描述】:

看起来非聚集索引搜索几乎要花掉所有的成本?虽然我对这种查询调优的黑暗艺术知之甚少,所以不确定。

我原来的查询是:

SELECT mxmservcallaudit.jobid, 
       mxmservcallaudit.dataareaid, 
       mxmservcallaudit.date AS maxdate, 
       UPPER(mxmservcallaudit.USERID) AS maxuser
FROM mxmservcallaudit
INNER JOIN (SELECT jobid, dataareaid, MAX(RECID) AS maxrecid
            FROM mxmservcallaudit
            WHERE type = 9 AND dataareaid = 'ansa'
            GROUP BY dataareaid, jobid) AS statusdate1 
    ON  mxmservcallaudit.DATAAREAID = statusdate1.DATAAREAID 
    AND MXMSERVCALLAUDIT.RECID = statusdate1.maxrecid;

目前查询计划在这里:

https://www.brentozar.com/pastetheplan/?id=Hys80JZAS

有什么我可以做的吗,或者这是最好的吗?

编辑:表结构为:

编辑:使用 RECOMPILE 我得到了一个类似的执行计划,除了 NESTED LOOP 现在消失了(这很好吗?):

https://www.brentozar.com/pastetheplan/?id=SJq4fG-AS

【问题讨论】:

  • 您能否共享 mxmservcallaudit 的表结构,特别是索引和唯一键约束。
  • 您最后一次进行任何索引维护/统计更新是什么时候?
  • 嗨@BarneyL 我已经按照建议添加了表格结构
  • 索引维护在计划的 SQL 作业中定期完成@YannickLiekens
  • 哇,考虑到您估计的 VS 实际行数,这肯定闻起来像参数嗅探。只是为了测试将 OPTION(RECOMPILE) 放在查询末尾,看看是否有不同的计划。

标签: sql performance tsql sql-server-2012


【解决方案1】:

我猜,由于您使用的谓词,您的非聚集索引搜索不会去任何地方。 但是您可以通过使用窗口函数来简化和优化您的查询,从而消除一个冗余的表查询。 我想你可能会使用这样的东西:

with cte as (
    select
            jobid, dataareaid, date, USERID, 
            row_number() over (partition by jobid order by RECID desc) as RowNumber
    from mxmservcallaudit
    where type = 9 AND dataareaid = 'ansa'
)
select jobid, 
       dataareaid, 
       date as maxdate, 
       upper(USERID) as maxuser
    from cte
    where RowNumber = 1;

【讨论】:

  • 嗨@DanRom,所以我最初将此查询作为CTE,但它的性能更差。我只是再试一次,它仍然比原来的查询更糟糕。我想这是尽可能快的,所以我会保持原样。感谢回复
猜你喜欢
  • 1970-01-01
  • 2011-05-16
  • 2015-01-08
  • 2014-11-19
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多