我有以下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,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,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
我不能包含执行计划,因为除了查询之外我没有db的权限.
解决方法
我的猜测是,缓慢的执行计划以不幸的方式执行速率> 0过滤,就像在循环连接内部扫描的一部分一样.
如果归结为它,一种解决方案是存储中间结果集并在单独的语句中对其进行过滤.
我建议您理解您不能对供应商的数据库进行更改,并且您基本上卡住了.这实际上是从优化器中取消了一些控制 – 你通常不想做的事情 – 并且还在创建临时表时增加了相对少量的开销.但它应该缓解这种情况的缓慢.如果可能的话,我会继续与您的供应商合作制定索引策略.
select a.date,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