我有一个名为 readings 的表,其中包含 > 7600 万行,我正在运行此查询:
declare @tunnel_id int = 13
SELECT TOP 1 local_time, recorded_time
FROM readings
WHERE tunnel_id = @tunnel_id
ORDER BY id DESC
id列是bigint,设置为主键,有聚集索引,在tunnel_id字段上也有索引。
我正在尝试的 20 个不同的 tunnel_id 中的大约 16 个在不到一秒的时间内返回效果很好。但是,在最后 4 左右,查询需要 40 秒并使用数十万次读取。
我尝试将查询修改为:
SELECT TOP (1) local_time, recorded_time
FROM readings
where id = (
SELECT TOP 1 id
FROM readings
WHERE tunnel_id = 13
ORDER BY id DESC
)
对于一些隧道 ID 来说,这又一次很慢。更让我感到困惑的是,内部选择对于慢 id 的运行速度很快,如果我硬编码最大 id 而不是子查询,它也运行得很快。
我在这里缺少什么导致此查询执行不佳?
编辑评论:
Tunnel_id 不是唯一的,每个隧道都有数百万行。这是在 Sql Server 2012 上运行的。
我包括了快速和慢速运行的实际执行计划,它们是相同的。
快速地:
慢的:
但正如您所看到的,第一个执行不到一秒,而第二个需要 51 秒。