sql – 使用where子句进行慢查询

前端之家收集整理的这篇文章主要介绍了sql – 使用where子句进行慢查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下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

猜你在找的MsSQL相关文章