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

时间:2012-06-04 15:29:29

标签: mysql sql

我有这个问题:

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,然后它基于主键进行选择,以便对其进行索引。解释查询说,它只搜索135k行,而且我不能为我的生活弄清楚为什么这么慢。

3 个答案:

答案 0 :(得分:8)

对于表格的每一行,一遍又一遍地分别运行内部查询。

由于内部查询中没有引用外部查询,我建议您拆分这两个查询,然后在WHERE子句中插入内部查询的结果。

答案 1 :(得分:6)

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

答案 2 :(得分:0)

我在这里的第一篇文章..对缺少格式感到抱歉

我遇到了如下所示的性能问题:

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

1sec:WHERE [Column] LIKE ('A','B','C') //经过硬编码的快速

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

我尝试加入而不是子查询。

我还尝试了硬编码的CTE。

我最后尝试了一个临时表。

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

唯一的解决方案是:

DECLARE @CSV nvarchar(max) = Select STRING_AGG([Value],',') From [Table];

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

...

WHERE @CSV LIKE CONCAT('%',[Column],'%')