【发布时间】:2019-11-15 08:15:21
【问题描述】:
我想寻求您的帮助。
我有一个如下所示的表格:
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 有 50 000 个序列 id,所以记录的大小是 500 * 50 000
我的查询:
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 秒。但我想让它更快。
你知道我怎样才能让它更快吗?也许另一个查询比我使用的更好?
感谢您的回答。
兄弟。
【问题讨论】:
-
桌子上有索引吗?
-
OP 的文本:还有其他列,但现在不重要了。另一件事,key 是一个 keypair (id,sequenceId),它们在表中被索引。
-
您可以尝试 EXISTS 或 JOIN 而不是 IN。然而,对于这样简单的查询,优化器可能会选择相同的执行路径。您也可以尝试使用临时表而不是表变量。以下是一些详细介绍这两个主题的文章:explainextended.com/2009/06/16/in-vs-join-vs-exists 和 sqlshack.com/when-to-use-temporary-tables-vs-table-variables
-
你是如何测量时间的?
-
请为您的表索引添加表类型的定义和
create index语句。在性能优化方面,这些细节至关重要。
标签: sql sql-server tsql query-performance