sql – 使用where子句进行慢查询
发布时间:2020-12-12 06:36:31 所属栏目:MsSql教程 来源:网络整理
导读:我有以下sql查询,只需1秒执行: 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分钟才能执行: select a
我有以下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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |