sql - 如何优化此选择
问题描述
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;
它在大约一分 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 子句中古老而脆弱的隐式连接。它对性能没有任何影响,它只是更好的编码风格。
推荐阅读
- oracle - 在 Oracle 云免费层中将 VM 与自治数据库连接
- javascript - 为什么在通过 HTTP 服务时需要指定 MIME 类型?
- python - 来自不同方法的python字典导致“缺少位置参数”错误
- android - 预期为 BEGIN_ARRAY,但在 GitHub API 中的第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT
- r - 如何编写自定义函数以从 `effects::Effect()` 中提取预测
- python - 尝试导入自己的包时出现 ModuleNotFoundError
- php - 在购物车 woocommerce 上同步两个产品数量
- go - template.Execute 不传递数据
- python - 带有 TortoiseORM 的 FastAPI:错误:无法处理的实体
- java - 使用 RSA 的加密套接字连接 java (IllegalArgumentException: Illegal base64 character 10)