【发布时间】:2019-09-05 02:56:47
【问题描述】:
我有以下 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
我无法包含执行计划,因为除了查询之外我没有对 db 的权限。
【问题讨论】:
-
rate列上是否有索引? -
SQL 不会像那样天真地执行。您几乎肯定会发现,无论有没有 CTE,您都会得到完全相同的执行计划。尝试更新所有统计信息(如果代码在存储过程中,则重新编译代码),确保您拥有所有必要的索引,然后重试。
-
a.name 上有索引吗?有多少行与您所追求的名称相同?其中有多少的比率> 0?一共有多少行? 7 分钟对我来说似乎太长了,就像我们不知道的其他事情正在严重错误一样。
-
列率没有索引。
-
@Yaqub 在提出这样的含糊建议时,请更加具体。您是指具有多个列的单个索引,还是两个单独的索引?
标签: sql sql-server