[ORACLE]oracle 表連接的幾種方式


總結如下表:

類別 嵌套循環連接(NESTED LOOP) 排序合並連接 (SORT MERGE JOIN) 哈希連接(HASH JOIN)
優化器 USE_NL
/*+ leading(表A) use_nl(表B) */
USE_MERGE USE_HASH
/*+ leading(表A) use_hash(表B)*/
使用條件 任何連接 主要用於不等價連接,如<、 <=、 >、 >=;
但是不包括 <>
HASH_JOIN_ENABLED=false
數據源已排序
僅用於等價連接
特點 當有高選擇性索引或進行限制性搜索時效率比較高,
能夠快速返回第一次的搜索結果。
(對於被連接的數據子集較小的情況,
嵌套循環連接是個較好的選擇,效率更高)

當缺乏索引或者索引條件模糊時,
排序合並連接比嵌套循環有效。源已經被排過序性能會優於散列連接

當缺乏索引或者索引條件模糊時,
哈希連接連接比嵌套循環有效。
通常比排序合並連接快。
在數據倉庫環境下,如果表的紀錄數多,效率高。
相關資源 CPU、磁盤I/O 內存、臨時空間 內存、臨時空間
缺點 當索引丟失或者查詢條件限制不夠時,效率很低;
當表的紀錄數多時,效率低。
所有的表都需要排序。它為最優化的吞吐量而設計,
並且在結果沒有全部找到前不返回數據。

為建立哈希表,需要大量內存。第一次的結果返回較慢。
如果HASH表太大,無法一次構造在內存中,則分成若干個
partition,寫入磁盤的temporary segment,
則會多一個寫的代價,會降低效率。

成本

outer access cost +
(inner access cost * outer cardinality)
不耗費PGA的work_area

 (outer access cost * # of hash partitions)
 + inner access cost
(outer access cost * # of hash partitions)
+ inner access cost
會耗費PGA的work_area
原理 在嵌套循環中,內表被外表驅動,
外表返回的每一行都要在內表中檢索找到與它匹配的行,
因此整個查詢返回的結果集不能太大(大於1 萬不適合),
要把返回子集較小表的作為外表(CBO 默認外表是驅動表),
而且在內表的連接字段上一定要有索引。
  做大數據集連接時的常用方式,優化器使用兩個表中較小的表
(或數據源)利用連接鍵在內存中建立散列表,
然后掃描較大的表並探測散列表,找出與散列表匹配的行
驅動表被驅動表

驅動表返回一行數據,被驅動表要被掃描一次
JOIN的順序很重要,驅動表的記錄集一定要小,返回結果集的響應時間是最快的。

 

  驅動表和被驅動表都被掃描1次

 

HASH JOIN:

創建INDEX后

create unique index "T1^0" on USREFUS(ID,NAME);
create index "
T1
^0" on USRBF2(ID,NAME);

NETSTED LOOPS

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM