我想请你帮忙。
我有一张桌子,看起来像这样:
1 | 1 1 | 2 1 | 3 2 | 1 2 | 2 2 | 3 2 | 4 ... 也有其他专栏,但现在并不重要。另一件事,键是键对(id,sequenceId),它们在表中建立索引。我想要的是获取给定ID的最后一行。例如,如果myId = 1->给我(1,3),myId = 2->给我(2,4)记录,依此类推。在我的表格中,有500个ID,每个ID具有5万个序列ID,因此记录的大小为500 * 50000
我的查询:
SELECT myId AS 'MyId', MAX(sequenceId) AS 'SequenceId' FROM myTable WHERE myId in (SELECT myId from @MyIds) GROUP BY(myId) OPTION (RECOMPILE); 不幸的是,这并没有我想要的那么快。在我的尝试中,@ MyIds包含所有ID(1-500),在这种情况下,执行时间约为1秒。但我想使其更快。
你有什么主意我可以更快地做吗?也许另一个查询比我使用的更好?
谢谢你的回答。
Br。
问题来源于stack overflow
首先,@MyIds是一个表变量,不是吗?您如何声明呢?它被索引了吗?在上面添加主键:
DECLARE @MyIds TABLE (ID INT PRIMARY KEY) 其次,请确保您的钥匙处于开启状态,myId+sequenceId而不是处于开启状态sequenceId+myId
第三,避免IN条款过多,这是一个瓶颈
这应该是您最好的选择:
SELECT myId MyId, MAX(sequenceId) SequenceId FROM myTable t WHERE EXISTS (SELECT TOP 1 'X' X from @MyIds m WHERE m.myId = t.myId) GROUP BY myId 您还可以尝试在分组后强制过滤器,请尝试:
SELECT * FROM ( SELECT TOP (9223372036854775807) myId MyId, MAX(sequenceId) SequenceId FROM myTable t GROUP BY myId ORDER BY myId ) T WHERE EXISTS (SELECT TOP 1 'X' X from @MyIds m WHERE m.myId = t.myId)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。