2011-11-23 60 views
1

是有使用ANSI語法在Informix查詢性能差異:差異查詢計劃ANSI OUTER JOIN和OUTER 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

是的,標準外連接和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

很酷的答案,但性能怎麼樣 – kubek2k

+0

但假設我們只使用條件加入 - 查詢是否會一樣? – kubek2k

+0

閱讀我的答案 - 它說什麼? –

0

測試並找出或發佈兩者的執行計劃,我們將幫助他們消化它們。

在其他當前的數據庫引擎中,它們將導致相同的執行計劃以適當的優化。

+0

其他DBMS不實現Informix風格的外連接AFAIK。至少,我很想知道哪些人會做。 –