14 外連線(hash join outer)--優化主題系列
外連線在分頁語句中有些特殊情況是無法優化的
left outer join與leftjoin等價
外連線(outerjoin)
外連線有三種,leftouter join,right outer join,full outer join。
左外連線,左表就做驅動表,右外連線,右表就做驅動表--在NL的時候
如果走HASH JOIN沒有這個限制
如果SQL是用ORACLE的寫法加號的另一邊的表做驅動表
下面舉個例子(基於SCOTT11gR2)
select ename,sal,job,dname,dept.deptno
from emp right outer join dept on emp.deptno=dept.deptno wheredept.deptno in(10,20,40);
上面的SQL與下面的SQL是等價的,只是SQL寫法不同
select ename,sal,job,dname,dept.deptno
from emp,dept where dept.deptno=emp.deptno(+) and dept.deptnoin(10,20,40);
select /*+ use_nl(emp,dept) */ ename,sal,job ,dname,dept.deptno
from emp right outer join dept on emp.deptno=dept.deptno wheredept.deptno in(10,20,40);
dept是驅動表對不對
是不是外連線走NL的時候沒辦法改變驅動表順序??
leading ordered都沒辦法更改驅動表順序??
有left join的時候如果走NL 那麼左表就是驅動表 rightjoin的時候右表就是驅動表
假如 A LEFTJOIN B 誰是驅動表A返回結果有10W行 B放回結果有100行這個時候咋辦??
讓它走HASH JOIN試試想讓EMP作為驅動表
/*+swap_join_input(emp)*/ 用這個HINT是可以的
這個HINT 還有一個作用就是多個表JOIN的時候能制定哪個表作為驅動表
A JOIN B 其中A表10GB B表100MB 你讓A作為驅動表
HASH JOIN 會對驅動表在PGA中進行HASH演算法 10GB PGA是放不下的
PGA中一個程序最多才2GB 另外 SORTMERGE JOIN其實也分驅動表
其實所有的join都要分驅動表 NL也是
如果走NL 誰主動約誰誰就在上面
如果走HASH JOIN可以用swap_join_inputs這個HINT 去交換驅動表順序
假設 A JOIN BJOIN C JOIN D 他們都走HASHJOIN 現在要C作為驅動表
提問如果SQL當中有外連線+ 該怎麼辦??
先看JOIN方式再看驅動表大小
相關推薦
14 外連線(hash join outer)--優化主題系列
外連線在分頁語句中有些特殊情況是無法優化的 left outer join與leftjoin等價 外連線(outerjoin) 外連線有三種,leftouter join,right outer j
15 半連線(semi-join)--優化主題系列
半連線(semi-join) 半連線是指兩個表/結果集做JOIN,但是隻返回某一個表/結果集中的資料。 執行計劃中,看到有NESTED LOOPS SEMI/HASH JOIN SEMI 就表示有半
16 反連線(anti-join)--優化主題系列
反連線(anti-join) 反連線其實是特殊的半連線。只是把in/exists換成了notin/not exists 執行計劃中,看到有NESTED LOOPS ANTI/HASH JOIN AN
12 排序合併連線(SORT MERGE JOIN)--優化主題系列
select * from a,b where a.id<=b.id;這個一般都走排序合併連線 排序合併連線(SORTMERGE JOIN) 前文提到巢狀迴圈以及雜湊連線,他們都有驅動表概念
圖解SQL的各種連線(Inner join,outer join,left join,right join)
由於 SQL Join 似乎被預設為基礎,同時利用 ‘文氏圖表’ 解釋它,乍一看似乎是很自然的選擇。然而,就像文章下面說的,我也發現在實際測試中,文氏圖並沒有完全符合SQL Join
多表外連線效能測試及優化
前提:資料庫中一共有三個表:class,book,phone,而且每個資料庫表中都有10萬條資料,三個表一共有30萬條資料,從大資料量的角度來檢測你寫的sql語句效能是如何的. 一.左連線 用s
MYSQL的各種連線(Inner join,outer join,left join,right join)
H. cross join表A和表B的資料進行一個N*M的組合,即笛卡爾積(交差集)。一般來說,我們很少用到這個語法。因為這種集合的使用對於效能來說非常危險,尤其是表很大。這裡就不做介紹了…例外的例子:一.先看一些最簡單的例子例子Table Aaid adate 1 a1 2 a2 3
10 巢狀迴圈(NESTED LOOP)--優化主題系列
Oracle從較小結果集(驅動表/外部表)中讀取一行,然後和較大結果集(被探查表/內部表)中的所有資料逐條進行比較(巢狀迴圈可以用於非等值連線),如果符合規則,就放入結果集中,然後取較小結果集的下一條
21 檢視合併(view merge) --優化主題系列
檢視合併(viewmerge) 當SQL語句中有內聯檢視(in-lineview,內聯檢視就是在from後面有select子查詢) 或者SQL語句中有用 createview...建立的檢視,CBO
Oracle 外連線(OUTER JOIN)
Oracle 外連線(OUTER JOIN) 左外連線(左邊的表不加限制) 右外連線(右邊的表不加限制) 全外連線(左右兩表都不加限制) 對應SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常省略OUTER關鍵字, 寫成:LEFT/RIGHT
Oracle優化器、優化模式、表的連線方式(Hash Join、Nested Loop、Sort Merge Join)
查詢優化器 Oracle的查詢優化器(QO)分為兩種: 1. RBO:Ruled-Based Optimization, 基於規則的優化器; 2. CBO :Cost-Based Optimization, 基於代價的優化器; 從 Orac
內連線(inner join)與外連線(outer join)小結
mySQL包含兩種聯接,分別是內連線(inner join)和外連線(out join),但我們又同時聽說過左連線,交叉連線等術語,本文旨在總結這些術語之間的關係。 1. 內連線 首先說明內連線的一個重要性質:內連線查詢結果與表的順序無關 (當然順序可
SQL優化--使用內連線(inner join)代替外連線(left join,right join)
避免 LEFT JOIN 和 NULL 當然,有很多時候您需要執行 LEFT JOIN 和使用 NULL 值。但是,它們並不適用於所有情況。改變 SQL 查詢的構建方式可能會產生將一個花幾分鐘執行的報告縮短到只花幾秒鐘這樣的天壤之別的效果。有時,必須在查詢中調
SQL中的交叉連線(CROSS JOIN)、內連線(INNER JOIN)、外連線(OUTER JOIN)
1、交叉連線CROSS JOIN 如果不帶條件子句,交叉連線將會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積; select *from 表名 cross join 表名 on 條件表示式 2、內連線 INNER JOIN 內連線僅返回那些滿足連線條件的資料行。在內連線中,
★★★ oracle外連線,Oracle中Left Outer Join和外關聯(+)的區別
【原】Oracle中Left Outer Join和外關聯(+)的區別 2008-03-23 16:22:37 Oracle的left join中on和where的區別 2009-09-28 15:20 今天遇到一個求某月所有天數的統計結果,如果某日的結果是0
Oracle外連線(left/right/full outer join)語法詳解
相比常用的精確查詢(內連線,inner join),外連線相比不好理解。但在實際工作中,用的還是很多的,深刻理解外連線成為必須。 看到一篇帖子,清晰易懂,轉發一下。 內容: -------------------------------------------------
Oracle 內連線(inner join)、外連線(outer join)、全連線(full join)
http://blog.itpub.net/30175262/viewspace-1472290/之前沒有用過 full outer join,第一次用,學習一下Student表Color表Oracle中的連線可分為,內連線(inner join)、外連線(outer joi
Join操作基本:外連線、自然連線、內連線
Join操作基本分為3大類:外連線(細分為:左連線、右連線、全連線)、自然連線、內連線 Join操作的共性:第一步均為將所有參與操作的表進行了一個笛卡兒積,然後才依據各連線 條件進行記錄的篩選 SQL> select * from employees;
JOIN連線:LEFT OUTER JOIN
外聯接。外聯接可以是左向外聯接、右向外聯接或完整外部聯接。 在 FROM 子句中指定外聯接時,可以由下列幾組關鍵字中的一組指定: LEFT JOIN 或 LEFT OUTER JOIN。 左向外聯接的結果集
oracle 表連線方式: nested loop 巢狀迴圈和Hash Join的比較
一、建立兩張實驗用表:wireless_site.merchant和wireless_site.bb SQL> select count(*) from wireless_site.merchant; COUNT(*) ---------- 14005