我需要以百分比计算每日价格差异。我的查询有效,但每天都在变慢。主要思想是计算前一行的增量。前一行通常是前一天,但有时可能会缺少一天。当发生这种情况时,它需要在最后一天可用。
我正在寻找一种方法来限制我在内部查询中检索的集合。每天新增约20,000条记录。
ng-model-options
答案 0 :(得分:0)
这在许多层面都是错误的。
1。)看起来您正在更新所有行,包括已设置min_percent_changed
的旧行,可能不应再次更新。
2。)即使新min_percent_changed
与旧版UPDATE
相同,您也在更新。
3。)您正在更新行以存储可以在运行中相当便宜地计算的冗余值(如果正确完成),从而使行更大且更容易出错并产生大量死行版本,这意味着很多真空工作,减慢其他一切。
您不应该 任何 。
如果你需要实现读取性能优化的每日增量,我建议一个小的额外的1:1表,可以廉价更新,而不会弄乱主表。特别是,如果每次重新计算每行的值。但更好地计算新数据。
如果您真的想要为每一行重新计算(就像您当前的MATERIALIZED VIEW
似乎那样),请将其设为CREATE INDEX price_watches_product_id_calculation_date_idx
ON price_watches(product_id, calculation_date DESC NULLS LAST);
以自动执行此过程。
如果我要演示的新查询足够快,请不要存储任何冗余数据并动态计算增量。
对于您当前的设置,当与此匹配索引结合使用时,此查询应该更快:
UPDATE price_watches pw
SET min_percent_changed = calc.delta
FROM price_watches p1
, LATERAL (
SELECT (1 - p1.price_min / p2.price_min) * 100 AS delta
FROM price_watches p2
WHERE p2.product_id = p1.product_id
AND p2.calculation_date < p1.calculation_date
ORDER BY p2.calculation_date DESC NULLS LAST
LIMIT 1
) calc
WHERE p1.price_min > 0
AND p1.calculation_date = current_date - 1 -- only update new rows!
AND pw.id = p1.id
AND pw.min_percent_changed IS DISTINCT FROM calc.delta;
查询:
current_date - 1
我将更新限制为“昨天”:{{1}}。这是对你实际需要的猜测。
添加查询的最后一行的说明:
类似于几个小时前dba.SE上的这个答案:
问题中的正确信息将允许我调整查询并提供更多解释。