我正在运行一批语句,以及此查询使用的相对时间的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
中使用该标志将其排除在未来的考虑范围之外。
这种思维方式是否稳固?根据我描述的功能,我还能做些什么来改进呢?
答案 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