回答

收藏

使用where查询子句慢

技术问答 技术问答 186 人阅读 | 0 人回复 | 2023-09-14

我有以下可以在1秒内执行的事情。sql查询:7 e  a# C: m. {& ^, w3 z! M
select a.date,b.rate,c.type,a.value froma inner join b on a.id = b.aidc inner join b.id = c.bidwhere a.name = 'xxx'但我需要一个结果集来获得比例大于0的结果。因此,当我将查询更改为此时,执行它需要7分钟:
+ l& K& R( \4 X( S5 b9 o: l; s' `. ^select a.date,b.rate,c.type,a.value froma inner join b on a.id = b.aidc inner join b.id = c.bidwhere a.name = 'xxx' and b.rate>0为什么查询时间从1秒增加到7分钟?b手表很大,所以我甚至试着用它CTE,但这也没有提高性能。我认为使用CTE可以从中筛选出较小的一组值,所以应该更快,但这无济于事:
) u3 V/ \' x# y9 d3 k0 X;with x as(select a.date,b.rate,c.type,a.value froma inner join b on a.id = b.aidc inner join b.id = c.bidwhere a.name = 'xxx')select * from x where rate>0我不能包括执行计划,因为我没有权限查询数据库。- |1 Y: |# N- C" G. y) o
                                                               
1 p/ u& d9 @7 _+ T0 v9 t; B9 Y    解决方案:                                                               
- k) F5 {. E4 b/ ?  l                                                                我的猜测是,缓慢的执行计划正在进行中rate>0以不幸的方式筛选,如循环连接内部扫描的一部分或其他方式。. V( m& ~  ?/ R0 m9 ^
如果归结为此,一个解决方案是将中间结果集存储并过滤到单独的句子中。
, n. N/ @+ v& ?6 x% K1 O我建议你这样做的前提是你不能更改供应商的数据库,你基本上陷入了困境。本质上,这使得优化器失去了一些控制(你通常不想这样做),并在创建临时表时增加了相对较少的成本。但这可以减少这种情况下的慢性。如果可能的话,我将继续与您的供应商合作,制定索引策略。5 J# b( E* R+ B/ g* q
select a.date,b.rate,c.type,a.value into #tfrom a inner join b on a.id = b.aidc inner join b.id = c.bidwhere a.name = 'xxx'select * from #t where rate>
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则