Разница в плане запросов при использовании ANSI OUTER JOIN и OUTER в Informix - PullRequest
2 голосов
/ 23 ноября 2011

есть ли разница в производительности запросов Informix с использованием синтаксиса ANSI:

SELECT .. 
  LEFT OUTER JOIN some_table ON (<condition>) 
  LEFT OUTER JOIN some_other_table (<condition_on_some_table>)

и специфический для Informix OUTER синтаксис:

SELECT ... 
  OUTER (some_table, 
   OUTER(some_other_table)) 
WHERE <join_conditions>

спасибо

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Да, существуют различия в семантике стандартного внешнего соединения и внешнего соединения в стиле Informix, что неизбежно означает, что существуют различия в плане запроса.

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

В чем разница?Справедливый вопрос - трудно объяснить, и еще сложнее придумать хороший (правдоподобный пример).По сути, запись в стиле Informix сохраняет строки из «доминантных» таблиц (внешних таблиц), даже если существуют критерии, основанные на значениях во внешней объединенной таблице, которые отклоняют эти строки.

Эти два запроса дают один и тот же результат:

SELECT i.*, o.*
  FROM DominantTable AS i, OUTER OuterJoinedTable AS o
 WHERE i.pk_column = o.fk_column;

SELECT i.*, o.*
  FROM DominantTable AS i
  LEFT OUTER JOIN OuterJoinedTable AS o
    ON i.pk_column = o.fk_column;

Эти два запроса не обязательно приводят к одному и тому же результату:

SELECT i.*, o.*
  FROM DominantTable AS i, OUTER OuterJoinedTable AS o
 WHERE i.pk_column = o.fk_column
   AND (o.alt_column IS NULL OR o.alt_column = 1);

SELECT i.*, o.*
  FROM DominantTable AS i
  LEFT OUTER JOIN OuterJoinedTable AS o
    ON i.pk_column = o.fk_column
 WHERE (o.alt_column IS NULL OR o.alt_column = 1);

Разница возникает в такой ситуации:

DominantTable                              OuterJoinedTable
pk_column   other_column                   fk_column   alt_column
1           twenty                         1           3

Стандартная запись LEFT OUTER JOIN создаст пустой набор в качестве результата.Соединение в стиле Informix даст результат:

pk_column   other_column   fk_column   alt_column
1           twenty         null        null

Данные из DominantTable не были отклонены из-за условия фильтрации в доминирующей таблице, поэтому они сохраняются Informix.Стандартное объединение выполняет внешнее объединение, а затем фильтрует результат.

0 голосов
/ 23 ноября 2011

Протестируйте и выясните или опубликуйте планы выполнения для обоих, и мы поможем их переварить.

В других современных движках базы данных они приведут к тому же плану выполнения с должной оптимизацией.

...