對外連接的表加上條件後將會使外連接失效

現象:一條SQL的運行突然變得很慢。

select uidTable.column_value, first_name||' '||last_name,

company, job_title, upper(member_level), upper(service_value)

from (select * from table(select cast(multiset

(select b from bbb)as Taaa) from dual)) uidTable,member

where uidTable.column_value = member.login_id(+) and

member.site='alibaba' and member.site='test';

原因:經檢查錯誤得原因是用戶增加了一個條件member.site=test,造成連接的順序變化了,原來的驅動表是uidTable(最多1024條記錄),現在變成了member表做驅動(600W條)。所以這條語句變得特別慢。

但是既然是外連接,爲什麽連接的順序會改變呢?因爲外連接的連接順序不是由COST決定的,而是由連接的條件決定的。發現執行計劃如下:

-------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost |

------------------------------------------------

| 0 | SELECT STATEMENT | | 1018 | 72278 | 8155 |

| 1 | NESTED LOOPS | | 1018 | 72278 | 8155 |

| 2 | VIEW | | 4072 | 69224 | 11 |

| 3 | COLLECTION ITERATOR SUBQUERY FETCH| | | | |

| 4 | TABLE ACCESS FULL | DUAL | 4072 | | 11 |

| 5 | TABLE ACCESS FULL | BBB | 41 | 287 | 2 |

| 6 | TABLE ACCESS BY INDEX ROWID | MEMBER | 1 | 54 | 2 |

|* 7 | INDEX UNIQUE SCAN | MEMBER_SITE_LID_PK | 4 | | 1 |

-------------------------------------------------

大家要問:“爲什麽根本就沒有執行外連接呢?”問題出在member.site='test'這個條件上,因爲對外連接的表加了條件,造成外連接失效。改爲member.site(+)='test'後,問題徹底解決。

---------------------------------

| Id | Operation | Name | Rows | Bytes | Cost |

-----------------------------------------------------

| 0 | SELECT STATEMENT | | 1018 | 72278 | 8155 |

| 1 | NESTED LOOPS | | 1018 | 72278 | 8155 |

| 2 | VIEW | | 4072 | 69224 | 11 |

| 3 | COLLECTION ITERATOR SUBQUERY FETCH| | | | |

| 4 | TABLE ACCESS FULL | DUAL | 4072 | | 11 |

| 5 | TABLE ACCESS FULL | BBB | 41 | 287 | 2 |

| 6 | TABLE ACCESS BY INDEX ROWID | MEMBER | 1 | 54 | 2 |

|* 7 | INDEX UNIQUE SCAN | MEMBER_SITE_LID_PK | 4 | | 1 |

-----------------------------------------------------

HTTP性能調優之設置連接失效時間(翻譯)
Setting Connection Timeouts設置連接失效時間首先講講爲什麽要設置連接失效時間。Connection time-outs help reduce the loss of processing resources consumed by idle connections. When you enable connection ...查看完整版>>HTTP性能調優之設置連接失效時間(翻譯)
 
千萬不要在手機的連接設置中的拔叫號碼前加上本地的區號
正常的應該是17266或17201 一定不要自己改爲本地區號+17266(例:037117266)這樣作的結果是,可以正常上網。下遊戲下MID。但不同的是。收費是按每分鍾6毛來收。。找移動去要錢。移動不給還說我自己亂改的。多收的錢...查看完整版>>千萬不要在手機的連接設置中的拔叫號碼前加上本地的區號
 
不停閃爍的圖片(可以加上連接)
網頁特效代碼,仿雅虎右側的菜單代碼特效<HTML><HEAD><TITLE>仿雅虎菜單</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><STYLE type=text/css>BO...查看完整版>>不停閃爍的圖片(可以加上連接)
 
利用正則表達式自動給Email地址和Url加上連接
利用正則表達式自動給Email地址和Url加上連接 利用正則表達式自動給Email地址和Url加上連接 using System;using System.Text.RegularExpressions; namespace CommLayer{ /// <summary> //...查看完整版>>利用正則表達式自動給Email地址和Url加上連接
 
不停閃爍的圖片(可以加上連接)
有什麽問題請到<a href='/bbs/forums.php?fid=21'>論壇</a>中發表<br><!-- 把如下代碼加入<body>區域中 --><!-- http://www.webjx.com/ --><!-- http://bbs.webjx.com-->...查看完整版>>不停閃爍的圖片(可以加上連接)
 
利用正則表達式自動給Email地址和Url加上連接
using System;using System.Text.RegularExpressions; namespace CommLayer{ /// <summary> /// 自動給郵件地址或email地址加上url /// </summary> public class HyperlinkUrl ...查看完整版>>利用正則表達式自動給Email地址和Url加上連接
 
Questions:連接兩個表進行查詢:可以輸入或不輸入查詢條件的sql 語句
一個連接兩個表查詢的sql 語句的思考A表 字段 gn,rq,qnt 數據:1001 2004-01-01 10.....1002 2004-01-04 3.......B表 字段 gn,rq,qnt 數據:1001 2004-01-01 3 ....1002 2004-01-04 6...... 我現在要出來這樣的結果...查看完整版>>Questions:連接兩個表進行查詢:可以輸入或不輸入查詢條件的sql 語句
 
數據庫層抽象工廠更新1——多表內連接條件查詢操作
針對在Select中返回單表DataSet的情況,對該方法進行了重載,采用最常用的InnerJoin連接返回多表數據相關資料鏈接: /// <summary> /// 多表內連接條件查詢操作 /// </summary> /// <p...查看完整版>>數據庫層抽象工廠更新1——多表內連接條件查詢操作
 
有夢最美,Adamo XPS 原來有這些不會出貨的表兄弟!
有夢最美,Adamo XPS 原來有這些不會出貨的表兄弟!
關于 Dell 家的 Adamo XPS 大小細節部分,大概就缺個確切出貨的日期,不過這部筆電背後,可是還有很多不爲人知的秘密。其實也沒啥啦!不過就是一票不會出貨的原型機,隨著 PC World 潛入 Dell 密訪,也一並來曝光;而...查看完整版>>有夢最美,Adamo XPS 原來有這些不會出貨的表兄弟!
 
 
回到王朝網路移動版首頁