优化涉及各种表的MAX聚合查询

时间:2012-03-06 10:01:15

标签: sql postgresql query-optimization aggregate-functions

我有一些或多或少像这样的表(我将使用更简单的域,所以解释更清楚):

Trades
----------
ID
Seller_ID
Trade_Date

Sellers
-------
ID
Department_ID

我希望获得每个部门的最新交易。查询类似于:

SELECT Department_ID, MAX(Trade_Date) FROM 
Trades, Sellers
WHERE Trades.Seller_ID = Sellers.ID
GROUP BY Sellers.Department_ID

表Trades在日期上有一个索引,所以它可以用来加速查询,但我注意到查询对某些部门运行速度很快(对id进行硬编码)而对其他部门来说非常慢。

我推断,这是因为每个部门的交易量巨大差异。数据库正在对排序的索引进行顺序扫描以获得第一次出现,并且那些在很久以前进行最新销售的部门将需要在索引中走得很远。

我当前的解决方案是将最新的查询结果存储在辅助表中,并使新查询增量(按辅助​​表中已有的最新日期进行过滤)。它解决了这个问题,因为查询运行非常频繁,现在索引扫描只需要考虑几秒钟的交易。

但我认为应该有一个更优雅的解决方案。我知道如果聚合是由卖方而不是部门进行的,那么复合索引肯定会有所帮助,但我认为不允许构建产生不同表格的索引......

1 个答案:

答案 0 :(得分:1)

您是否考虑过使用物化视图,或者您是否使用postgres自行构建类似的视图?如果插入操作不如选择时间关键,那么我会考虑采用这种方式。

有一篇关于postgres MV的文章:

http://tech.jonathangardner.net/wiki/PostgreSQL/Materialized_Views