每日差异计算绩效改善

时间:2015-07-09 19:30:01

标签: sql postgresql

我需要以百分比计算每日价格差异。我的查询有效,但每天都在变慢。主要思想是计算前一行的增量。前一行通常是前一天,但有时可能会缺少一天。当发生这种情况时,它需要在最后一天可用。

我正在寻找一种方法来限制我在内部查询中检索的集合。每天新增约20,000条记录。

ng-model-options

1 个答案:

答案 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上的这个答案:

问题中的正确信息将允许我调整查询并提供更多解释。