【发布时间】:2019-05-28 22:37:54
【问题描述】:
我想将子查询转换为连接以提高性能。
以下子查询需要很长时间才能加载。
SELECT c.tank_name, c.fuel_type, c.capacity, c.tank_id,
(SELECT TOP 1 b.Level
from Microframe.dbo.TrackMessages b
where b.IMEI = a.IMEI
AND b.Timestamp >= @Start
order by b.Timestamp ) AS Level,
(select top 1 b.Timestamp
from Microframe.dbo.TrackMessages b
where b.IMEI = a.IMEI
AND b.Timestamp >= @Start
order by b.Timestamp ) AS TimeStamp,
(SELECT top 1 b.Temp
from Microframe.dbo.TrackMessages b
where b.IMEI = a.IMEI
AND b.Timestamp >= @Start
order by b.Timestamp ) AS Temp
FROM GatexServerDB.dbo.device as a
JOIN GatexReportsDB.dbo.tbl_static_tank_info as c ON c.tank_id = a.owner_id
WHERE c.client_id = 65
AND a.IMEI IS NOT NULL
AND c.tank_id IN ({Tanks})
【问题讨论】:
-
您正在执行相同的相关子查询 3 次不同的时间。使用 CTE 通过
IMEI(或CROSS APPLY)检索所有 3 列。还要确保检查Microframe.dbo.TrackMessages表上的索引和碎片,确保至少有一个IMEI, Timestamp按顺序排列。 -
您正试图多次检索 same TrackMessages 记录。在返回 Level、Timestamp、Temp 字段的
FROM子句中添加单个子查询。如果Timestamp被索引覆盖,您可能不需要对其进行过滤,因为您返回的是Timestamp的最新 记录。您必须检查实际的执行计划 -
由于您似乎在处理物联网数据,因此您还应该检查
ROW_NUMBER等排名函数、窗口函数和LAST_VALUE等分析函数。在这种情况下它可能不会比TOP 1 ORDER BY快,但它可以在更多情况下使用 -
@PanagiotisKanavos 请你在这里详细描述一下,或者你可以用你的方式写查询来描述我的结果?
-
@EzLo CTE Retrive 请指导我?
标签: c# sql-server join inner-join database-performance