sql - 如何优化这个选择

标签 sql postgresql optimization

SELECT *
FROM   trips,
       dates
WHERE  places_number_on_flag > 0
       AND places_number > 0
       AND ( places_number - ( (SELECT Count(id)
                                FROM   resrv_customers
                                WHERE  trip = trips.id
                                       AND ow > 0)
                               + (SELECT Count(id)
                                  FROM   resrv_customers
                                  WHERE  trip = trips.id
                                         AND extra_seat = 1
                                         AND ow > 0) ) < 20 )
       AND dates.id = trips.trip_date
       AND dates.from_date > 2458553;  

它在大约 1 分 50 秒后返回 5 行。

我希望它更快。

最佳答案

一个优化是只运行一次子查询并使用条件聚合来计算座位数:

SELECT *
FROM   trips
  JOIN dates on dates.id = trips.trip_date
WHERE  places_number_on_flag > 0
       AND places_number > 0
       AND ( places_number - ( (SELECT Count(id) + count(id) filter (where extra_seat = 1)
                                FROM   resrv_customers
                                WHERE  trip = trips.id
                                       AND ow > 0)) < 20 )
       AND dates.from_date > 2458553;  

请注意,我用显式 JOIN 运算符替换了 WHERE 子句中古老而脆弱的隐式连接。它对性能没有任何影响,只是更好的编码风格。

关于sql - 如何优化这个选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415093/

相关文章:

c - GCC过度优化?自纪元开始以来的不同秒数取决于我在哪里编译

c++ - 如果输出无关紧要,则不会调用函数

mysql - SQL 匹配来自不同列的 ID 及其各自的用户名

mysql - 哪种连接可以合并单个 SQL 表中的记录?

.net - Oracle 选择查询花费的时间太长

postgresql - 如何从 PL/pgSQL 函数返回多行?

sql - 每次列更改时选择第一行

sql - 如何在不获取重复列名的情况下选择 SQL 连接中的所有字段?

sql - Rails 按关联计数排序

java - 拥有大量小方法是否有助于 JIT 编译器优化?