SQL是否完全执行子查询?

时间:2018-09-05 08:28:18

标签: postgresql

想象一下我有这个SQL查询,并且table2很大。

select product_id, count(product_id) 
from table1 
where table2_ptr_id in (select id 
                        from table2 
                        where author is not null)

SQL将首先执行子查询并将所有table2加载到内存中吗?例如,如果table1有10行,而table2有1000万行,那么先连接然后进行过滤会更好吗?或者DB足够聪明,可以在编写查询时对其进行优化。

1 个答案:

答案 0 :(得分:1)

您必须EXPLAIN查询才能知道它在做什么。

但是,如果将查询重写为,则在PostgreSQL中的查询性能可能会更好

SELECT product_id
FROM table1 
WHERE EXISTS (SELECT 1
              FROM table2
              WHERE table2.id = table1.table2_ptr_id
              AND table2.author IS NOT NULL);

然后PostgreSQL可以使用反联接,如果使用庞大的table2,它可能会表现更好。

备注::查询中的count对我来说没有任何意义。