如何高效从PostgreSQL表中获取两类筛选条件的计数?
高效合并PostgreSQL计数查询方案
你可以用单条SQL语句一次扫描表就得到两个统计结果,避免两次全表(或索引)扫描的开销,具体有两种简洁写法:
方法1:使用FILTER子句(PostgreSQL专属,可读性更强)
SELECT COUNT(*) FILTER (WHERE enabled = true) AS total_enabled, COUNT(*) FILTER (WHERE enabled = true AND age = 10) AS enabled_age_10 FROM mytbl;
方法2:使用CASE表达式(兼容多类SQL数据库)
SELECT SUM(CASE WHEN enabled = true THEN 1 ELSE 0 END) AS total_enabled, SUM(CASE WHEN enabled = true AND age = 10 THEN 1 ELSE 0 END) AS enabled_age_10 FROM mytbl;
性能优化建议
如果表数据量较大,建议创建复合索引来进一步提速:
CREATE INDEX idx_mytbl_enabled_age ON mytbl(enabled, age);
这个索引能让PostgreSQL直接通过索引完成计数,无需访问表的实际数据块,大幅降低IO开销。
合并查询的优势
原来的两条语句需要对表(或索引)执行两次扫描,合并后的语句仅需一次扫描,减少了磁盘IO和数据库计算成本,数据量越大,性能提升越显著。
内容的提问来源于stack exchange,提问作者programmer
相关产品推荐
相关产品推荐

