在Informix中使用ANSI OUTER JOIN和OUTER时查询计划的差异

时间:2011-11-23 13:52:07

标签: database informix outer-join

使用ANSI语法的Informix查询性能存在差异:

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 个答案:

答案 0 :(得分:3)

是的,标准外连接和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保留。标准连接执行外连接,然后过滤结果。

答案 1 :(得分:0)

测试并找出或发布两者的执行计划,我们将帮助消化它们。

在其他当前的数据库引擎中,它们将产生相同的执行计划以进行适当的优化。

相关问题