9

我有这个查询:

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,然后它根据主键进行选择,因此它被索引。解释查询说它只使用 where 搜索 135k 行,我终其一生都无法弄清楚为什么这么慢。

4

3 回答 3

13

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

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

于 2012-06-04T15:34:02.113 回答
8
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
于 2012-06-04T15:34:36.950 回答
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],'%')
于 2019-10-09T17:39:58.383 回答