编辑:这里 Nicolas 给出了更准确的答案。我对 Sybase 没有特别的经验,但我获得了在 Sql Server 上使用一个非常小的服务器处理大量数据的经验。从这次经验中,我了解到,当您处理大量数据并且您的服务器没有足够的内存来处理大量数据时,您会遇到瓶颈(我想将临时结果写入盘)。我认为这是您的情况(6000 万行),但我不知道 Sybase,这取决于许多因素,例如 mytable 拥有的列数和服务器拥有的 RAM 数量等......
这里是我刚刚做的一个小经验的结果:
我在 Sql-Server 和 PostgreSQL 上运行这两个查询。
查询 1:
SELECT id, max(version)
FROM mytable
GROUP BY id
查询 2:
SELECT id, version
FROM
(
SELECT id, version, ROW_NUMBER() OVER (PARTITION BY id ORDER BY version DESC) as RN
FROM mytable
) q
WHERE q.rn = 1
在 PostgreSQL 上,mytable 有 2.878.441 行。
Query#1 耗时 31.458 秒并返回 1.200.146 行。
Query#2 耗时 41.787 秒并返回 1.200.146 行。
在 Sql Server 上,mytable 有 1.600.010 行。
Query#1 需要 6 秒并返回 537.232 行。
Query#2 需要 10 秒并返回 537.232 行。
到目前为止,您的查询总是更快。所以我尝试了更大的桌子。
在 PostgreSQL 上,mytable 现在有 5.875.134 行。
查询#1 需要 100.915 秒并返回 2.796.800 行。
Query#2 耗时 98.805 秒并返回 2.796.800 行。
在 Sql Server 上,mytable 现在有 11.712.606 行。
查询 #1 需要 28 分 28 秒并返回 6.262.778 行。
查询#2 需要 2 分 39 秒 并返回 6.262.778 行。
现在我们可以做一个假设。在第一部分关于这次经历。两台服务器有足够的内存来处理数据,因此 Group By 更快。这个实验的第二部分可能会证明太多的数据会破坏 group by 的性能。为了防止瓶颈 ROW_NUMBER() 似乎可以解决问题。
批评:我在 PostgreSQL 上没有更大的表,也没有 Sybase 服务器。
对于这个实验,我在 x86_64 和 SQL Server 2012 - 11.0-2100.60 (X64) 上使用 PostgreSQL 9.3.5
也许 Nicolas 这个实验会对你有所帮助。