首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个带有子查询的SQL查询非常慢?

为什么这个带有子查询的SQL查询非常慢?
EN

Stack Overflow用户
提问于 2012-06-04 23:29:29
回答 3查看 13.4K关注 0票数 9

我有这样的疑问:

代码语言:javascript
运行
复制
select *
from transaction_batch
where id IN
(
    select MAX(id) as id
    from transaction_batch
    where status_id IN (1,2)
    group by status_id
);

内部查询运行得非常快(不到0.1秒),以获得两个ID,一个用于状态1,一个用于状态2,然后它根据主键进行选择,以便对其进行索引。explain查询说它使用where only搜索135k行,我无论如何也搞不懂为什么它这么慢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-04 23:34:37

代码语言:javascript
运行
复制
select b.*
from transaction_batch b
inner join (
    select max(id) as id
    from transaction_batch
    where status_id in (1, 2)
    group by status_id
) bm on b.id = bm.id
票数 8
EN

Stack Overflow用户

发布于 2012-06-04 23:34:02

内部查询一遍又一遍地为表的每一行单独运行。

由于内部查询中没有对外部查询的引用,因此建议您拆分这两个查询,并将内部查询的结果插入到WHERE子句中。

票数 12
EN

Stack Overflow用户

发布于 2019-10-10 01:39:58

我在这里的第一个帖子..很抱歉没有格式化

我有一个性能问题,如下所示:

90秒:WHERE [Column] LIKE (Select [Value] From [Table]) //动态,慢速

1秒:WHERE [Column] LIKE ('A','B','C') //硬编码,速度快

1秒:WHERE @CSV like CONCAT('%',[Column],'%') //解决方案,如下

我试着加入,而不是子查询。

我也尝试过硬编码的CTE。

我最后试了一下临时表。

这些标准选项都不起作用,我也不愿意使用dosp_execute选项。

唯一有效的解决方案是:

代码语言:javascript
运行
复制
DECLARE @CSV nvarchar(max) = Select STRING_AGG([Value],',') From [Table];

// This yields @CSV = 'A,B,C'

...

WHERE @CSV LIKE CONCAT('%',[Column],'%')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10883908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档