У меня есть запрос, как это:Postgres оставил присоединение 3 таблицы с условием
SELECT x.id
FROM x
LEFT JOIN (
SELECT a.id FROM a
WHERE [condition1] [condition2]
) AS A USING (id)
LEFT JOIN (
SELECT b.id FROM b
WHERE [condition1] [condition3]
) AS B USING (id)
LEFT JOIN (
SELECT c.id FROM c
WHERE [condition1] [condition4]
) AS C USING (id)
WHERE [condition1]
Как вы можете видеть [condition1]
является общим для подзапросов и внешнего запроса.
Когда [в целом] может быть целесообразно удалить [condition1]
из подзапросов (в результате это же) по соображениям производительности? Пожалуйста, не давайте ответов, как «запустите его и посмотрите». Есть много данных и их изменение, поэтому нам нужно хорошее худшее поведение.
Я попытался сделать некоторые тесты, но они далеки от окончательного. Будет ли Postgres выяснять, что условие применяется к подзапросам и распространяет его?
Примеры condition1
:
WHERE a.id NOT IN (SELECT id FROM {ft_geom_in})
(это медленно, я знаю, это только для примера)WHERE a.id > x
'EXPLAIN' Некоторые запросы по меньшей схеме должны быть информативными. Это будет зависеть от того, что вы надеялись найти во внешнем запросе и о том, какие индексы могут помочь. В общем, я подозреваю, что выполнение условия только в подзапросах левого соединения будет лучше, если нет соответствующих индексов, но может быть менее полезным, если есть индексы с возможностью использования. –