【发布时间】:2011-12-04 03:01:05
【问题描述】:
我在 Postgres 中尝试检索购买量大于销售量的目录产品的最新价格时遇到了问题。此时它是一个相当大的表,超过 200 万行。我有这个出于历史目的。我目前使用的是:
select * from ta_price a
join (
select catalogproduct_id, max(timestamp) ts
from ta_price
group by catalogproduct_id
) b on a.catalogproduct_id = b.catalogproduct_id
and a.timestamp = b.ts
AND buy > sell;
catalogproduct_id 是 catalogproduct 表的外键。
在总共 2201760 行中,它选择了 2296 行。总运行时间为 181,792.705 毫秒。
关于如何改进这一点的任何见解?
编辑:
我被所有的答案震惊了!我还想在 Django ORM 的范围内更多地限定这个问题。我正在努力在此表上合并一个复合键(或类似键)(使用 catalogproduct_id 和时间戳)。我有一个主键,它是一个自动递增索引,我想这和没有主键一样好。
编辑 2:
添加@Erwin 建议的部分索引后,
CREATE INDEX my_partial_idx ON ta_price (catalogproduct_id, timestamp)
WHERE buy > sell;,我正在使用来自 @wildplasser 的查询大约 10-12 秒的查询时间。为了进一步澄清,我的表格是产品价格(买卖)随时间变化的快照。在任何给定时间,我都想知道当前(截至最新快照时间)哪些产品具有buy > sell。
【问题讨论】:
-
查询的初始运行使@wildplasser 占每个人大约一半的时间,同时仍然尊重预期的结果集。由于尝试在 Django 中工作,我仍然没有真正的索引。
-
Django 与否——如果你想要更快的速度,你需要一个或多个合适的索引。但首先要做的事情是:你的 postgres 版本是什么?
-
是的,我在其中找到了您的部分索引,但使用了@wildplasser 查询。现在缩短到10秒左右!!谢谢!!
标签: sql django postgresql