2016-03-31 1 views
0

У меня есть несколько таблиц, около четырех, которые я хочу объединить. Для того, чтобы сделать свой код понятнее и читаемым (для меня), я хотел бы присоединиться ко всем сразу, а затем процеживают в конце:Объединение нескольких таблиц: где эффективно фильтровать

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.

+6

Запись считываемого кода, оптимизатор должен заботиться о порядке фильтрации. – jarlh

+2

вы также можете использовать фильтр прямо в условии соединения: 'FROM t1 JOIN t2 ON t1.field = t2.field И t2.column3> 42'. Но все три альтернативы, скорее всего, составят один и тот же план выполнения. Но ** только ** способ проверить это - посмотреть планы выполнения (в обоих продуктах) –

+0

Для PosgresSQL или MySQL используйте EXPLAIN, чтобы получить дополнительную информацию о том, как будет выполняться ваш запрос. SQL Server имеет графический инструмент для отображения плана выполнения. Чтобы оптимизировать запуск SQL с вывода плана выполнения –

ответ

2

Оптимизатор запросов всегда будет пытаться найти наиболее оптимальный план из вашего SQL.

Вам следует больше сосредоточиться на написании читаемого, поддерживаемого кода, а затем, проанализировав план выполнения, найдите неэффективные части вашего запроса (и, более вероятно) неэффективные части вашей базы данных и дизайн индексации.

Перемещение вашей фильтрации из предложения where в предложение соединения без какого-либо значимого анализа может быть потрачено впустую.

0

Регистрация будет работать лучше, если вы правильно указали.

+0

Это не отвечает на вопрос. – MikeTheLiar

1

Ваш первый подход всегда будет лучше, так как механизм SQL будет оценивать, где условия сначала, а затем выполнять объединения. Поэтому при оценке предложения where он будет фильтровать записи, если условия доступны.

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 
+1

Это просто неправда (по крайней мере, не «вообще», как вы утверждаете, что это так). Я не удивлюсь, если обе альтернативы приведут к тем же планам исполнения. –

 Смежные вопросы

  • Нет связанных вопросов^_^