成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談Oracle中的三種Join方法

數據庫 Oracle 數據庫運維
這里將為大家介紹Oracle中的三種Join方法,Nested loop join、Sort merge join和Hash join。整理出來以便幫助大家學習。

基本概念

Nested loop join:

Outer table中的每一行與inner table中的相應記錄join,類似一個嵌套的循環。

Sort merge join:

將兩個表排序,然后再進行join。

Hash join:

將兩個表中較小的一個在內存中構造一個Hash 表(對Join Key),掃描另一個表,同樣對Join Key進行Hash后探測是否可以join,找出與之匹配的行。

一張小表被hash在內存中。因為數據量小,所以這張小表的大多數數據已經駐入在內存中,剩下的少量數據被放置在臨時表空間中;

每讀取大表的一條記錄,就和小表中內存中的數據進行比較,如果符合,則立即輸出數據(也就是說沒有讀取臨時表空間中的小表的數據)。而如果大表的數據與小表中臨時表空間的數據相符合,則不直接輸出,而是也被存儲臨時表空間中。

當大表的所有數據都讀取完畢,將臨時表空間中的數據以其輸出。如果小表的數據量足夠小(小于hash area size),那所有數據就都在內存中了,可以避免對臨時表空間的讀寫。

如果是并行環境下,前面中的第2步就變成如下了:每讀取一條大表的記錄,和內存中小表的數據比較,如果符合先做join,而不直接輸出,直到整張大表數據讀取完畢。如果內存足夠,Join好的數據就保存在內存中。否則,就保存在臨時表空間中。

適用范圍

Nested loop join:

適用于outer table(有的地方叫Master table)的記錄集比較少(<10000)而且inner table(有的地方叫Detail table)索引選擇性較好的情況下(inner table要有index)。

inner table被outer table驅動,outer table返回的每一行都要在inner table中檢索到與之匹配的行。當然也可以用ORDERED 提示來改變CBO默認的驅動表,使用USE_NL(table_name1 table_name2)可是強制CBO 執行嵌套循環連接。

cost  = outer access cost + (inner access cost * outer cardinality)

Sort merge join:

用在數據沒有索引但是已經排序的情況下。

通常情況下hash join的效果都比Sort merge join要好,然而如果行源已經被排過序,在執行排序合并連接時不需要再排序了,這時Sort merge join的性能會優于hash join。可以使用USE_MERGE(table_name1 table_name2)來強制使用Sort merge join。
cost = (outer access cost * # of hash partitions) + inner access cost

Hash join:

適用于兩個表的數據量差別很大。但需要注意的是:如果HASH表太大,無法一次構造在內存中,則分成若干個partition,寫入磁盤的temporary segment,則會多一個I/O的代價,會降低效率,此時需要有較大的temporary segment從而盡量提高I/O的性能。

可以用USE_HASH(table_name1 table_name2)提示來強制使用散列連接。如果使用散列連HASH_AREA_SIZE 初始化參數必須足夠的大,如果是9i,Oracle建議使用SQL工作區自動管理,設置WORKAREA_SIZE_POLICY 為AUTO,然后調整PGA_AGGREGATE_TARGET 即可。

也可以使用HASH_JOIN_ENABLED=FALSE(默認為TRUE)強制不使用hash join。

cost = (outer access cost * # of hash partitions) + inner access cost

效率比較

Hash join的主要資源消耗在于CPU(在內存中創建臨時的hash表,并進行hash計算),而merge join的資源消耗主要在于磁盤I/O(掃描表或索引)。在并行系統中,hash join對CPU的消耗更加明顯。所以在CPU緊張時,最好限制使用hash join。

在絕大多數情況下,hash join效率比其他join方式效率更高:

在Sort-Merge Join(SMJ),兩張表的數據都需要先做排序,然后做merge。因此效率相對最差;
Nested-Loop Join(NL)效率比SMJ更高。特別是當驅動表的數據量很大(集的勢高)時。這樣可以并行掃描內表。
Hash join效率最高,因為只要對兩張表掃描一次。

【編輯推薦】

  1. MySQL中Join算法實現原理分析
  2. 通往性能優化的JOIN方法說明
  3. SQL中的JOIN的簡潔解釋
責任編輯:彭凡 來源: sina博客
相關推薦

2009-07-16 16:23:59

Swing線程

2010-11-16 16:11:28

Oracle身份驗證

2013-01-10 10:26:56

SQL Server數據庫

2010-10-28 10:27:35

oracle賦權

2010-11-19 14:51:09

Oracle數據庫關閉

2011-05-26 13:16:37

Oracle數據庫備份

2010-11-15 14:42:03

Oracle查詢重復記

2022-08-24 08:07:11

MyBatisSQLMySQL

2021-12-20 07:11:26

Java List排序 Java 基礎

2009-06-29 18:21:29

Hibernate

2010-09-08 13:29:48

CSS

2009-07-08 12:56:32

編寫Servlet

2019-08-30 17:24:41

microservic微服務

2011-05-20 17:08:32

2022-05-31 16:00:46

Go 編程語言復制文件Go 標準庫

2022-05-30 07:07:35

Java監聽文件Java 8

2023-10-13 00:00:00

Redis模塊空間對象

2010-03-30 11:15:26

Oracle數據庫

2009-12-11 18:49:39

預算編制博科資訊

2022-07-13 16:06:16

Python參數代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费精品 | 国产91九色 | 日韩欧美网 | 在线观看日本高清二区 | 一级黄色av电影 | 国产精品国产三级国产aⅴ浪潮 | 精品一区二区三区四区 | 中文字幕 视频一区 | 亚洲综合无码一区二区 | 久久国产一区二区 | 亚洲精品一二区 | 国产精品一区二区三区久久 | 999久久久免费精品国产 | 一区二区三区视频在线观看 | 国产精品不卡 | 国产精品久久久久久久久久 | 青青久在线视频 | 精品成人一区二区 | 亚洲精品乱码久久久久久9色 | 91九色porny首页最多播放 | 国产精品国产成人国产三级 | 国产精品免费在线 | 日韩免费 | 国内自拍视频在线观看 | 激情五月婷婷丁香 | 国产99精品| 午夜网址 | 成人黄色在线 | 午夜天堂精品久久久久 | 亚洲一区二区免费电影 | 999久久久 | 亚洲成人一区 | 欧美成人一级 | 欧美日韩成人 | 久视频在线 | 天天干亚洲 | 久久精品国产一区二区电影 | 国产高清在线观看 | 日本三级电影在线免费观看 | 久久99精品国产自在现线小黄鸭 | 国产1区2区在线观看 |