当前位置: 首页 > 面试题库 >

使用where子句的查询缓慢

周翰池
2023-03-14
问题内容

我有以下只需1秒即可执行的sql查询:

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


 类似资料:
  • 问题内容: 我最近才刚开始使用SQLAlchemy,但仍无法解决某些概念。 归结为基本元素,我有两个这样的表(通过Flask-SQLAlchemy): 我将如何查询用户列表及其最新帖子(不包括无帖子的用户)。如果我使用的是SQL,则可以执行以下操作: 因此,我确切地知道“期望的” SQL可以达到我想要的效果,但是不知道如何在SQLAlchemy中“正确地”表达它。 编辑:如果很重要,我使用的是SQ

  • 问题内容: 将SELECT查询放在UPDATE查询的WHERE子句中时出现错误。 我的查询是这样的: AND错误将显示如下: “无法在FROM子句中指定目标表’m’进行更新” 问题答案: 实际上,您可以通过将其包装在子查询中来更新它(从而为结果创建临时表) 或使用 JOIN

  • 问题内容: 谁能给我一些关于如何将这种子查询放入提示?(我正在使用 JPA 2.0 - Hibernate 4.x ) -第二个选择将始终获得单个结果或null。 问题答案: 尝试类似以下示例的操作来创建子查询: 请注意,由于附近缺少IDE,因此该代码尚未经过测试。

  • 问题内容: 是否可以执行这样的mysql查询? 我需要在一般的“ where”子句中使用子查询的结果。 问题答案: 您可以将其包装在子查询中,如下所示:

  • 问题内容: 该问题可能特定于SQL Server。当我编写查询时,例如: 是否对表的EACH行执行Case内的Case内的函数调用fnQuarterDate(或任何子查询)? 如果我预先在类似这样的变量中获取函数(或任何子查询)的值,会怎么样呢? 我知道在MySQL中,如果WHERE子句中的IN(..)内有子查询,则对每一行都执行该子查询,我只想为SQL SERVER查找相同的子查询。 … 只需填

  • 问题内容: 我有一个Google Spreadsheet,我想运行一个函数。但是我希望该语句检查一系列值。我基本上是在寻找要在SQL中使用的语句-Google Spreadsheets中的等效语句是什么?所以现在我有: 那行得通。但是我真正需要的是: 当然,该声明会失败。如何获得一系列值的位置?这些是文本值,如果有区别的话。 问题答案: 大招Zolley!这是一个小改进。 代替: = CONCAT