PostgreSQL是否会对子查询去重?两种SQL写法性能有差异吗?
PostgreSQL子查询去重与SQL性能差异分析
首先明确:PostgreSQL不会对EXISTS子查询做额外去重处理。因为EXISTS的核心逻辑是判断子查询是否存在匹配行,只要找到第一行匹配结果就会终止扫描,全程不会处理所有符合条件的行,因此不存在去重的场景。
再看你给出的两个SQL语句:
第一个语句:
SELECT EXISTS (SELECT * FROM b WHERE a.col = b.col) AS e FROM a WHERE e
第二个语句:
SELECT EXISTS (SELECT * FROM b WHERE a.col = b.col) FROM a WHERE EXISTS (SELECT * FROM b WHERE a.col = b.col)
这两个语句在性能上没有实质差异。PostgreSQL的查询优化器会自动识别第一个语句中别名e对应的是EXISTS子查询的结果,在生成执行计划时会直接将WHERE e替换为对应的EXISTS条件,最终两个语句的执行计划完全一致,不会出现重复执行子查询的情况。
内容的提问来源于stack exchange,提问作者Dull Bananas
相关产品推荐
相关产品推荐

