У меня есть несколько таблиц, около четырех, которые я хочу объединить. Для того, чтобы сделать свой код понятнее и читаемым (для меня), я хотел бы присоединиться ко всем сразу, а затем процеживают в конце:Объединение нескольких таблиц: где эффективно фильтровать
SELECT f1, f2, ..., fn
FROM t1 INNER JOIN t2 ON t1.field = t2.field
INNER JOIN t3 ON t2.field = t3.field
INNER JOIN t4 ON t3.field = t4.field
WHERE // filters here
Но я подозреваю, что размещение каждой таблицы в подзапросов и фильтрации в каждой области будет делать работу лучше.
SELECT f1, f2, ..., fn
FROM (SELECT t1_f1, t1_f2, ..., t1_fi FROM t1 WHERE // filter here) AS a
INNER JOIN
(SELECT t2_f1, t2_f2, ..., t2_fj FROM t2 WHERE // filter here) AS b
ON // and so on
Просьба сообщить, что приведет к повышению производительности и/или если моя догадка верна. Я готов пожертвовать показателями производительности.
Если фильтрация в каждом подзапросе будет более эффективной, будет ли иметь значение архитектура базы данных, или это справедливо для всех SQL-дисков RDBMS?
Я использую SQL Server и Postgres.
Запись считываемого кода, оптимизатор должен заботиться о порядке фильтрации. – jarlh
вы также можете использовать фильтр прямо в условии соединения: 'FROM t1 JOIN t2 ON t1.field = t2.field И t2.column3> 42'. Но все три альтернативы, скорее всего, составят один и тот же план выполнения. Но ** только ** способ проверить это - посмотреть планы выполнения (в обоих продуктах) –
Для PosgresSQL или MySQL используйте EXPLAIN, чтобы получить дополнительную информацию о том, как будет выполняться ваш запрос. SQL Server имеет графический инструмент для отображения плана выполнения. Чтобы оптимизировать запуск SQL с вывода плана выполнения –