我有以下 sql 查询,只需 1 秒即可执行:
select a.date, b.rate, c.type, a.value from
a inner join b on a.id = b.aid
c inner join b.id = c.bid
where a.name = 'xxx'
但我需要一个结果集来获取速率大于 0 的结果。因此,当我将查询更改为此时,执行需要 7 分钟:
select a.date, b.rate, c.type, a.value from
a inner join b on a.id = b.aid
c inner join b.id = c.bid
where a.name = 'xxx' and b.rate>0
为什么这会使查询时间从 1 秒增加到 7 分钟?由于 b 表很大,我什至尝试使用 CTE,但这也没有提高性能。我认为使用 CTE 将会有更小的值集可供过滤,因此它应该更快,但这没有帮助:
;with x as
(select a.date, b.rate, c.type, a.value from
a inner join b on a.id = b.aid
c inner join b.id = c.bid
where a.name = 'xxx')
select * from x where rate>0
我无法包含执行计划,因为除了查询之外我没有数据库权限。
我的猜测是缓慢的执行计划正在做rate>0
以一种不幸的方式进行过滤,例如作为循环连接内部扫描的一部分或其他内容。
如果归根结底,一种解决方案是存储中间结果集并在单独的语句中对其进行过滤。
我建议这样做的前提是您无法更改供应商的数据库并且您基本上陷入困境。这本质上是剥夺了优化器的一些控制权——这是您通常不想做的事情——并且还通过创建临时表增加了相对少量的开销。但它应该可以缓解这种情况下的缓慢情况。如果可能的话,我将继续与您的供应商合作制定索引策略。
select a.date, b.rate, c.type, a.value
into #t
from a inner join b on a.id = b.aid
c inner join b.id = c.bid
where a.name = 'xxx'
select * from #t where rate>0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)