首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server优化大型表上的MAX()

Server优化大型表上的MAX()
EN

Stack Overflow用户
提问于 2022-07-13 22:09:22
回答 1查看 60关注 0票数 -1

我的公司有一系列SQL视图。一个关键视图有一个子select,它从一个大表中获取max(id)并与另一个表连接。

在一个示例中,我用100万行填充了一个测试表。最大值(id )(id是一个整数值)需要8分钟。最上面和顺序按顺序用8分钟。在实验中,我尝试了max(id),(partion by(id))花了一秒钟。结果集是正确的。不知道为什么这会让事情这么快。任何想法都很受欢迎。具有1m行的新测试表是tblmsg_nicholas。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-07-17 10:28:21

关于MAX()。看起来,您正在计算您的MAX()或多或少像这样。

代码语言:javascript
复制
select max(tm2.ID)
  from [dbo].[TBLMSG_NICHOLAS] tm2
 where msgtype = 'LV_ALLOC' and TM.GroupID = tm2.groupID

TBLMSG_NICHOLAS (msgtype, GroupID, ID DESC)上的索引加速了该子查询。查询规划器可以直接随机访问该索引:第一个匹配行包含所需的MAX(ID)值。

但是你也使用了一个所谓的依赖相关的子查询。将这样的子查询重构为JOINed独立的子查询通常是个好主意。但是很难帮助您做到这一点,因为您没有显示整个查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72973151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档