提高前1个查询的性能

时间:2018-05-30 08:37:33

标签: sql-server performance tsql cross-apply

我正在运行一批语句,以及此查询使用的相对时间的100%:

select c.*,q.dbupddate
  into #c
  from 
   customer c
   cross apply
   (
    select top 1 code,transferred,dbupddate
    from transfer_customer_connect_log l
    where l.code=c.code
    order by dbupddate desc
   )q
  where q.transferred=0

有了这个计划:https://www.brentozar.com/pastetheplan/?id=Syq811nJm

此查询旨在将行从一个数据库(app_connect)传输到另一个数据库(app)。在transfer_customer_connect_log表中,已经处理了transfer = 1的记录,必须将其忽略。此外,从transfer = 0的剩余行中,一些(客户)代码可能在表中多次存在,具有不同的(dbupd)日期,在这种情况下,我必须只考虑最新的。

我从计划中看到sort by dbupddate占据前1名,占97%的时间。所以,我在(dbupddate,code)上添加了一个pk聚簇索引。有趣的是,没有任何改变!不需要索引进行排序吗?

另一种方法是,不是每次都进行最近一次检查,而是保存"通过标记" old"带有标志的行(传输= 0但不是最近的前1个),然后在where中使用该标志将其排除在未来的考虑范围之外。

这种思维方式是否稳固?根据我描述的功能,我还能做些什么来改进呢?

1 个答案:

答案 0 :(得分:0)

使用row_number()

select * 
from ( select c.*, l.dbupddate, l.transferred 
            , row_number() over (PARTITION BY l.code ORDER BY l.dbupddate desc) as rn
        from customer c
        join transfer_customer_connect_log l
          on l.code = c.code 
     ) t
where t.rn = 1
  and t.transferred = 0