PostgreSQL连接和where子句执行顺序

5kgi1eie  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(1)|浏览(1090)

我有两个表,是在PostgreSQL的外键绑定如下;

tableA (id, status) 
   - indexes;
      - (id)
      - (status)
tableB (id, tableAId, result)
   - indexes;
      - (id, tableAId)
      - (tableAId)

tableB通过使用tableAId字段绑定到具有外键的tableA
我想通过特定的条件连接两个表(所有过滤器都基于索引)。有两种方法可以应用过滤器,但是我想知道哪种方法更有效。

- select * from tableA a join tableB b on a.id = b.tableAId where a.status = 'X' and b.id = 123
- select * from tableA a join tableB b on a.id = b.tableAId and a.status = 'X' and b.id = 123

如您所见,第一个查询在where节中包含筛选器,但第二个查询在joinon节中包含筛选器。据我所知,join操作在where子句之前完成,因此我预计第二个查询将比第一个查询具有更好的性能。对吗?

exdqitrt

exdqitrt1#

您可以在前面添加EXPLAIN来查看特定查询的执行计划,这将解释postgres将如何尝试执行查询。您甚至可以在查询前面添加EXPLAIN ANALYZE来检查执行查询时的性能。
然而,重要的是要理解,查询的执行计划是建立在查询应该尽可能快地正确执行的思想上的。因此,应用语句的顺序并不固定,它是先执行where还是先执行join只取决于postgres根据它所拥有的统计信息认为这两个语句中的哪一个执行得更快。事实上,它甚至可以混合使用这两种方法,首先执行一个where's,然后执行一个join,再执行另一个where。
最后,你展示的两个查询非常相似,人们可以很容易地分辨出它们是相同的,所以postgres也可以分辨出它们是相同的,这并不奇怪。因为查询是相同的,postgres会在内部将查询重写为相同的查询,然后相应地为它们制定相同的执行计划。

相关问题