總結如下表:
類別 | 嵌套循環連接(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 | 內存、臨時空間 | 內存、臨時空間 |
缺點 | 當索引丟失或者查詢條件限制不夠時,效率很低; 當表的紀錄數多時,效率低。 |
所有的表都需要排序。它為最優化的吞吐量而設計, 並且在結果沒有全部找到前不返回數據。 |
為建立哈希表,需要大量內存。第一次的結果返回較慢。 |
成本 | outer access cost + |
(outer access cost * # of hash partitions) + inner access cost |
(outer access cost * # of hash partitions) + inner access cost 會耗費PGA的work_area |
原理 | 在嵌套循環中,內表被外表驅動, 外表返回的每一行都要在內表中檢索找到與它匹配的行, 因此整個查詢返回的結果集不能太大(大於1 萬不適合), 要把返回子集較小表的作為外表(CBO 默認外表是驅動表), 而且在內表的連接字段上一定要有索引。 |
做大數據集連接時的常用方式,優化器使用兩個表中較小的表 (或數據源)利用連接鍵在內存中建立散列表, 然后掃描較大的表並探測散列表,找出與散列表匹配的行 |
|
驅動表被驅動表 | 驅動表返回一行數據,被驅動表要被掃描一次
|
驅動表和被驅動表都被掃描1次 |
HASH JOIN:
創建INDEX后
create unique index "T1^0" on USREFUS(ID,NAME); create index "
T1
^0" on USRBF2(ID,NAME);
NETSTED LOOPS