gpt4 book ai didi

sql - 使用 where 子句的慢查询

转载 作者:行者123 更新时间:2023-12-02 08:41:31 27 4
gpt4 key购买 nike

我有以下 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

关于sql - 使用 where 子句的慢查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456702/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com