我在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和主键的最大值以及写入触发器来构建它,但我正在寻找更优雅的解决方案。有没有?
答案 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”值插入辅助表。