如何优化SELECT some_field,max(primary_key)FROM表GROUP BY some_field

时间:2014-12-04 15:00:37

标签: sql sql-server azure-sql-database

我在SQL Azure中有SQL查询:

SELECT some_field, max(primary_key) FROM table GROUP BY some_field

表目前有超过600万行。创建索引(some_field asc,primary_key desc)。 primary_key字段是增量的。 some_field有大约700个不同的值。此选择至少需要30秒。

此表中只有插入,没有更新或删除。

我可以创建单独的表来存储some_field和主键的最大值以及写入触发器来构建它,但我正在寻找更优雅的解决方案。有没有?

2 个答案:

答案 0 :(得分:0)

不知道这是否有效,但你可以试一试......

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY some_field ORDER BY primary_key DESC) AS rn
   FROM table
)
SELECT *
FROM cte
WHERE rn = 1

答案 1 :(得分:0)

绝对要在“somefield”列上编制索引的“somefield”和“highestPK”列的辅助表。将前一次构建为基线并使用它。

然后,只要有任何新记录插入到600万条记录表中,就可以通过一个简单的触发器来更新辅助表,其中包含一些简单的事情。

update SecondaryTable
   set highestPK = newlyInsertedPKID
   where somefield = newlyInsertedSomeFieldValue

这样,每次插入都会保持更新,因为“somefield”列的最高PK将符合条件,如果没有可用的更新,则使用新的“somefield”值插入辅助表。