PostgreSQL 哪个更快,双重使用函数还是从 select 中选择?

问题描述 投票:0回答:1

我想知道哪种方法通常更快(PostgreSQL)? 产品移动示例

SELECT id, quantity, product_id,
       sum(quantity) OVER (PARTITION BY product_id ORDER BY create_date) sum_quantity
FROM product_moves
WHERE sum(quantity) OVER (PARTITION BY product_id ORDER BY create_date) > 10

SELECT id, quantity, product_id, sum_quantity
FROM (
    SELECT id, quantity, product_id,
           sum(quantity) OVER (PARTITION BY product_id ORDER BY create_date) sum_quantity
    FROM product_moves
) product_moves
WHERE sum_quantity > 10

在第一种方法中,我有两次相同的功能,在第二种方法中,我有两个选择。或者有没有更好的方法来实现这个?

我尝试运行查询,但结果非常不一致。

sql postgresql optimization
1个回答
0
投票

即使第一种方法执行得很好(因为@jarlh指出的事实),我认为不会有显着差异,因为:

  • 在第一种方法中,RDBMS 应仅通过获取的行对 SUM 求和一次,然后在查询中每次出现时替换其值。
  • 在第二种方法中,RDBMS 不应逐一执行查询,而是以流式方式执行。

无论如何,我怀疑它们中的任何一个都会获得最佳性能,因为它们都确实对同一个product_id执行了多次完整的SUM操作(我的意思是:当获取行时,相同的product_id值将重复出现多次) ,不是吗?)。

因此,我建议您创建两个查询:一个对 Product_id 的每个唯一值执行 SUM,第二个查询连接第一个查询的表中的所有行以获取总和值。

WITH
sum_by_product AS (SELECT product_id, SUM (quantity) AS sum_quantity FROM product_moves GROUP BY product_id),
detail AS (SELECT t1.id, t1.quantity, t1.product_id, t2.sum_quantity FROM product_moves t1 INNER JOIN sum_by_product t2 ON t1.product_id=t2.product_id)
SELECT * FROM detail WHERE sum_quantity>10
;
© www.soinside.com 2019 - 2024. All rights reserved.