Sql 优化涉及各种表的最大聚合查询

Sql 优化涉及各种表的最大聚合查询,sql,postgresql,query-optimization,aggregate-functions,Sql,Postgresql,Query Optimization,Aggregate Functions,我有一些表或多或少是这样的(我将使用一个更简单的域,以便解释更清楚): 我想了解每个部门的最新交易情况。查询类似于: SELECT Department_ID, MAX(Trade_Date) FROM Trades, Sellers WHERE Trades.Seller_ID = Sellers.ID GROUP BY Sellers.Department_ID 表Trades有一个日期索引,因此可以使用它来加快查询速度,但我注意到查询对于某些部门运行得很快(硬编码id),而对于其他部门

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

我想了解每个部门的最新交易情况。查询类似于:

SELECT Department_ID, MAX(Trade_Date) FROM 
Trades, Sellers
WHERE Trades.Seller_ID = Sellers.ID
GROUP BY Sellers.Department_ID
表Trades有一个日期索引,因此可以使用它来加快查询速度,但我注意到查询对于某些部门运行得很快(硬编码id),而对于其他部门运行得很慢

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

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


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

您是否考虑过使用物化视图,或者如果您使用postgres自己构建类似的内容?如果插入操作不像选择的时间那么关键,那么我会考虑这样做。 有一篇关于博士后MVs的文章:


您是否尝试过卖家ID和交易日期的复合索引?另外,两个表中记录的数量是多少?我已经检查过了,在当前模式上已经有了这样的索引。这一数字约为每周300万笔交易。查询需要几秒钟,但应该几乎是即时的。由于数据量和查询响应要求如此之大,您现有的方法对我来说似乎是最好的-但其他人可能有更好的想法…sellers.department\u id、未提及表中的外键或sellers的候选键有什么用?请添加(一段)相关的表定义,这将节省我们大量的猜测和打字。不幸的是,插入内容更重要!我不想让insert性能下降太多您是否考虑过这样的作业(意味着具有AGGRAGION结果的表每30秒更新一次或诸如此类的事情)?我找不到任何关于postgresql使用触发器直接实现这种功能的自治事务的信息(似乎它不支持类似的东西)。您还可以查看他们的通知系统:
SELECT Department_ID, MAX(Trade_Date) FROM 
Trades, Sellers
WHERE Trades.Seller_ID = Sellers.ID
GROUP BY Sellers.Department_ID