我想查询巨型表(SQL Server)以获取一组记录的最新版本,例如
桌子:
Id, key, Ver
1, A, 1
2, B, 1
3, A, 2
4, B, 2
5,B, 3
结果:
Id, Key, Ver
3, A, 2
5, B, 3
此处提到的join方法将起作用,但仅当想要获取所有密钥的最新版本时才有效,但是如果我们仅关心密钥的子集,则join将产生过多的开销。所以我想问我们是否应该做一个循环
select top 1 * from table where key = 'A' order by ver desc
或者
select max(ver), key from table where key in ('A', 'B') group by key
还是有更好的方法呢?干杯
本质上,n
对于任何RDBMS而言,一次循环一组键并执行一次操作是一种不好的方法。它阻止查询引擎进行优化,并保证n
对表\索引的搜索\扫描。
如果您可以将查询表示为基于集合的操作,这将使查询引擎完全优化您的操作,从而创建更为优化的查询计划。
如果您使用的是SQL Server 2008或更高版本,请使用RANK
,
SELECT
[Id],
[Key],
[Ver]
FROM
[Table]
WHERE
RANK() OVER (PARTITION BY [Key], ORDER BY [Ver] DESC) = 1;
使用更通用的SQL
SELECT
[T1].[Id],
[T2].[Key],
[T2].[Ver]
FROM (
SELECT
[Key]
MAX([Ver]) [Ver]
FROM
[Table]
WHERE
[Key] IN ('A', 'B')
GROUP BY
[Key]) [T2]
JOIN
[Table] [T1]
ON [T1].[Key] = [T2].[Key] AND [T1].[Ver] = [T2].[Ver];
为确保两个查询的性能,请在Key
then上创建覆盖索引Ver
。
CREATE UNIQUE NONCLUSTERED INDEX [IX_Table_Key_Ver]
ON [Table] ([Key], [Ver] DESC);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句