我的公司有一系列SQL视图。一个关键视图有一个子select,它从一个大表中获取max(id)并与另一个表连接。
在一个示例中,我用100万行填充了一个测试表。最大值(id )(id是一个整数值)需要8分钟。最上面和顺序按顺序用8分钟。在实验中,我尝试了max(id),(partion by(id))花了一秒钟。结果集是正确的。不知道为什么这会让事情这么快。任何想法都很受欢迎。具有1m行的新测试表是tblmsg_nicholas。
INNER JOIN LongviewHoldTable lvhold WITH (NOLOCK) ON lvhold.MsgID = case tm.MsgType when 'LV_BLIM' /*then (select max(tm2.ID) from [dbo].[TBLMSG_NICHOLAS] tm2
where msgtype = 'LV_ALLOC' and TM.GroupID = tm2.groupID)*/
/*then (SELECT TOP 1 ID FROM TBLMSG_NICHOLAS TM2 WHERE msgtype = 'LV_ALLOC' and TM.GroupID =tm2.GroupID ORDER BY ID DESC)*/
then (select max(tm2.ID) OVER (PARTITION BY ID) from [dbo].[TBLMSG_NICHOLAS] tm2
where msgtype = 'LV_ALLOC' and TM.GroupID = tm2.groupID)
else tm.ID
end
WHERE
TA.TARGETTASKID IS NOT NULL AND
TA.RESPONSE IS NULL发布于 2022-07-17 10:28:21
关于MAX()。看起来,您正在计算您的MAX()或多或少像这样。
select max(tm2.ID)
from [dbo].[TBLMSG_NICHOLAS] tm2
where msgtype = 'LV_ALLOC' and TM.GroupID = tm2.groupIDTBLMSG_NICHOLAS (msgtype, GroupID, ID DESC)上的索引加速了该子查询。查询规划器可以直接随机访问该索引:第一个匹配行包含所需的MAX(ID)值。
但是你也使用了一个所谓的依赖相关的子查询。将这样的子查询重构为JOINed独立的子查询通常是个好主意。但是很难帮助您做到这一点,因为您没有显示整个查询。
https://stackoverflow.com/questions/72973151
复制相似问题