You need to enable JavaScript to run this app. PostgreSQL筛选子项分布在多个地点的父盒子的实现方案
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL筛选子项分布在多个地点的父盒子的实现方案

现有方案评估

你的现有实现逻辑是正确的,在给出的测试场景中可以正确筛选出符合要求的父盒子(仅返回id为2的记录),不存在逻辑错误。但在两百万级数据量的场景下,两层聚合(DISTINCT ON + 外层GROUP BY)会产生额外的计算开销,存在明显的性能优化空间。

更简便高效的实现方案

你可以直接通过一次GROUP BY配合COUNT(DISTINCT)完成统计,无需CTE中间层,语法更简洁,执行效率更高,且兼容所有当前官方支持的PostgreSQL版本:

SELECT b.box_id
FROM boxes b
INNER JOIN things t ON b.id = t.box_id
WHERE t.quantity > 0
GROUP BY b.box_id
HAVING COUNT(DISTINCT t.place_id) > 1;

该方案和你的原查询返回结果完全一致,减少了一次中间结果集的处理步骤,大数据量下性能优势更为明显。

索引优化建议

为了进一步提升两百万级数据表的查询速度,建议添加以下复合索引,实现覆盖索引扫描,避免回表查询:

  • boxes表添加复合索引:CREATE INDEX idx_boxes_parent_child ON boxes(box_id, id);
  • things表添加复合索引:CREATE INDEX idx_things_box_quantity_place ON things(box_id, quantity, place_id);

内容的提问来源于stack exchange,提问作者snakecharmerb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 22:24:03