SQL полностью выполняет подзапросы? - PullRequest
0 голосов
/ 05 сентября 2018

Представьте, что у меня есть этот SQL-запрос, а таблица 2 ОГРОМНА.

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

Будет ли SQL сначала выполнять подзапрос и загружать всю таблицу2 в память? например, если в table1 10 строк, а в table2 10 миллионов строк, лучше сначала объединить, а затем отфильтровать? Или БД достаточно умен, чтобы оптимизировать этот запрос так, как он написан.

1 Ответ

0 голосов
/ 05 сентября 2018

Вы должны 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 в вашем запросе не имеет никакого смысла для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...