开发者社区> 问答> 正文

如何以最快的方式获取给定ID的最新记录?(MS SQL)

我想请你帮忙。

我有一张桌子,看起来像这样:

id | sequenceId

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

展开
收起
保持可爱mmm 2019-11-15 17:35:07 358 0
1 条回答
写回答
取消 提交回答
  • 首先,@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)

    2019-11-15 17:35:43
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
AnalyticDB基础版:云原生My SQL 敏捷数仓 立即下载
第十二届 BigData NoSQL Meetup — 基于hbase的New sql落地实践 立即下载
时序数据库TSDB的SQL与流计算 立即下载