通過10104閱讀hash join工作機制 ---Optimal
Hash Join 執行有三種工作機制: Optimal,onepass, multipass,兩張表進行
hash join,通常是將小表在記憶體中built hash table,另一張表進行filter,hash值匹
配的行,再校驗具體條件是否滿足(因為我們知道hash計算時候,存在hash-
collision問題,這就意味著可能不同的行值,出現相同的hash值,所以必須進行校
驗)。小表在記憶體中搭建hash 表,可能存在記憶體不足的問題,這就出現了上述描述
的三個工作機制,以下的部分是通過event 10104來窺探具體工作機制。
一、概述部分
1、hash area size的總體分配
hash area size = hash_table size + bitmap table size + 管理空間大小
具體體現在跟蹤檔案內容如下:
Original hash-area size: 1009238
--資料庫分配hash-area大小,由引數hash_area_size決定
Memory for slot table: 737280
--實際存放小表hash值的記憶體大小,我們可以把他稱為hash table或者多個partitions
Calculated overhead for partitions and row/slot managers: 271958
--主要包含bitmap表和管理資訊
2、hash table的分配
hash table size = sum(partitions) = N * slots =N * Block_size * Multiblocks IO
--每個分割槽的大小不一定相同
--N:表示slot 的數量
如:hash_table size = 18 * 8*5=720KB = 737280
Number of partitions: 8
--資料庫將hash table的記憶體空間劃分成8個區域
Number of slots: 18
--資料庫的記憶體採用chunk方式管理,分為18個chunks,在跟蹤檔案中以slot或者cluster表示。
Multiblock IO: 5
--hash table的每次IO是5個blocks
Block size(KB): 8
--每個block的大小為8K
Cluster (slot) size(KB): 40
--每個slot的大小是40KB,具體計算:block_size * Multiblock IO = 8*5=40KB
Minimum number of bytes per block: 8160
--每個block最小可用空間為8160
3、bitmap表空間分配情況
Bit vector memory allocation(KB): 32
--bitmap表分配空間為32KB
Per partition bit vector length(KB): 4
--因為有8個partition,所以每個分割槽大小是4K
4、build表的資訊
Maximum possible row length: 577
--最大存放的行數是577,而我們實際所需要build表的行數是500,所以我們可以大概猜測為optimal hash join。
二、Optimal hash join
1、hash表的總述
*** RowSrcId: 1 HASH JOIN BUILD HASH TABLE (PHASE 1) ***
Total number of partitions: 8
--總分割槽表是8個
Number of partitions which could fit in memory: 8
--在記憶體中我們所能裝的分割槽表數量為8,意味著小表能全部放置在記憶體中
Number of partitions left in memory: 8
--留在記憶體中的分割槽表為8
Total number of slots in in-memory partitions: 8
--放在記憶體中分割槽表所用到的slots數量為8,即 8 *40 = 320KB
Total number of rows in in-memory partitions: 500
--放入記憶體中分割槽表的小錶行數是500,意味著小表全部行放入了記憶體分割槽表
2、記憶體分割槽表具體存放行數的資訊
### Partition Distribution ###
Partition:0 rows:67 clusters:1 slots:1 kept=1
Partition:1 rows:67 clusters:1 slots:1 kept=1
Partition:2 rows:46 clusters:1 slots:1 kept=1
Partition:3 rows:74 clusters:1 slots:1 kept=1
Partition:4 rows:57 clusters:1 slots:1 kept=1
Partition:5 rows:58 clusters:1 slots:1 kept=1
Partition:6 rows:74 clusters:1 slots:1 kept=1
Partition:7 rows:57 clusters:1 slots:1 kept=1
kept=1:表示該分割槽在記憶體中,如果kept=0表示分割槽表在磁碟中。
Final number of hash buckets: 1024
--hash表由1024個hash bucket來管理
3、hash表的具體存放資訊:
645+282+77+18+2 =1024
### Hash table ###
Number of buckets with 0 rows: 645
Number of buckets with 1 rows: 282
Number of buckets with 2 rows: 77
Number of buckets with 3 rows: 18
Number of buckets with 4 rows: 2
Number of buckets with 5 rows: 0
Number of buckets with 6 rows: 0
Number of buckets with 7 rows: 0
Number of buckets with 8 rows: 0
Number of buckets with 9 rows: 0
Number of buckets with between 10 and 19 rows: 0
Number of buckets with between 20 and 29 rows: 0
Number of buckets with between 30 and 39 rows: 0
Number of buckets with between 40 and 49 rows: 0
Number of buckets with between 50 and 59 rows: 0
Number of buckets with between 60 and 69 rows: 0
Number of buckets with between 70 and 79 rows: 0
Number of buckets with between 80 and 89 rows: 0
Number of buckets with between 90 and 99 rows: 0
Number of buckets with 100 or more rows: 0
--hash表由hash bucket進行管理,從上面資訊我們可以知道500行資料具體分佈資訊:
有282個hash bucket包含1行資料
有77個hash bucket包含2行資料
有18個hash bucket包含3行資料
有2個hash bucket包含4行資料
hash bucket數量=282+77+18+2 = 379
如果hash bucket分佈異常不平均,如某個hash bucket所包含的行數特別多,有可能是小表中參與hash計算join columns的重複的值太多造成,需要重寫語句,剔除該重複值,因為hash bucket下所包含的行數越多,消耗的CPU資源越大。
4、hash表的統計資訊:
Total buckets: 1024 Empty buckets: 645 Non-empty buckets: 379
Total number of rows: 500
Maximum number of rows in a bucket: 4
Average number of rows in non-empty buckets: 1.319261
5、大表的使用bitmap進行匹配過濾資訊
Used bitmap filtering: filtered rows=7 minimum required=50 out f=1000
Used bitmap filtering: filtered rows=114 minimum required=50 out f=1000
Used bitmap filtering: filtered rows=258 minimum required=50 out f=1000
Used bitmap filtering: filtered rows=427 minimum required=50 out f=1000
.....................................................
6、以上Optimal工作機制描述
A、先將hash area size 空間分為三部分,第一部分是ORACLE內部管理記憶體;第二部分是將記憶體的hash table分為8個分割槽表,hash table 由hash bucket管理,第三部分是bitmap表;
B、小表在記憶體中構建hash表,先將join columns的數值進行hash function計算,對應的值為hash bucket,如以上案例,進行hash function計算,500行資料,需要379個hash buckets來管理,我手工計算為376個,不知道為什麼計算偏差3個。小表中所需的columns存放到記憶體hash table。hash bucket其所對應的bitmap設定為1。
C、大表在與小表進行hash join時候,先將join columns進行相同的hash function計算,計算結果與bitmap點陣圖進行比對,如果該點陣圖的bit=0,表示對應的hash bucket所管理的記憶體不存在小表rows,因此直接將該行拋棄,如果bit=1,則在對應的hash bucket中找到對應的儲存小錶行,與大表的行按照join columns條件,進行實際列數值匹配,如果匹配,表示該行符合查詢條件,如果不匹配,則直接丟棄。
hash join,通常是將小表在記憶體中built hash table,另一張表進行filter,hash值匹
配的行,再校驗具體條件是否滿足(因為我們知道hash計算時候,存在hash-
collision問題,這就意味著可能不同的行值,出現相同的hash值,所以必須進行校
驗)。小表在記憶體中搭建hash 表,可能存在記憶體不足的問題,這就出現了上述描述
的三個工作機制,以下的部分是通過event 10104來窺探具體工作機制。
一、概述部分
1、hash area size的總體分配
hash area size = hash_table size + bitmap table size + 管理空間大小
具體體現在跟蹤檔案內容如下:
Original hash-area size: 1009238
--資料庫分配hash-area大小,由引數hash_area_size決定
Memory for slot table: 737280
--實際存放小表hash值的記憶體大小,我們可以把他稱為hash table或者多個partitions
Calculated overhead for partitions and row/slot managers: 271958
--主要包含bitmap表和管理資訊
2、hash table的分配
hash table size = sum(partitions) = N * slots =N * Block_size * Multiblocks IO
--每個分割槽的大小不一定相同
--N:表示slot 的數量
如:hash_table size = 18 * 8*5=720KB = 737280
Number of partitions: 8
--資料庫將hash table的記憶體空間劃分成8個區域
Number of slots: 18
--資料庫的記憶體採用chunk方式管理,分為18個chunks,在跟蹤檔案中以slot或者cluster表示。
Multiblock IO: 5
--hash table的每次IO是5個blocks
Block size(KB): 8
--每個block的大小為8K
Cluster (slot) size(KB): 40
--每個slot的大小是40KB,具體計算:block_size * Multiblock IO = 8*5=40KB
Minimum number of bytes per block: 8160
--每個block最小可用空間為8160
3、bitmap表空間分配情況
Bit vector memory allocation(KB): 32
--bitmap表分配空間為32KB
Per partition bit vector length(KB): 4
--因為有8個partition,所以每個分割槽大小是4K
4、build表的資訊
Maximum possible row length: 577
--最大存放的行數是577,而我們實際所需要build表的行數是500,所以我們可以大概猜測為optimal hash join。
二、Optimal hash join
1、hash表的總述
*** RowSrcId: 1 HASH JOIN BUILD HASH TABLE (PHASE 1) ***
Total number of partitions: 8
--總分割槽表是8個
Number of partitions which could fit in memory: 8
--在記憶體中我們所能裝的分割槽表數量為8,意味著小表能全部放置在記憶體中
Number of partitions left in memory: 8
--留在記憶體中的分割槽表為8
Total number of slots in in-memory partitions: 8
--放在記憶體中分割槽表所用到的slots數量為8,即 8 *40 = 320KB
Total number of rows in in-memory partitions: 500
--放入記憶體中分割槽表的小錶行數是500,意味著小表全部行放入了記憶體分割槽表
2、記憶體分割槽表具體存放行數的資訊
### Partition Distribution ###
Partition:0 rows:67 clusters:1 slots:1 kept=1
Partition:1 rows:67 clusters:1 slots:1 kept=1
Partition:2 rows:46 clusters:1 slots:1 kept=1
Partition:3 rows:74 clusters:1 slots:1 kept=1
Partition:4 rows:57 clusters:1 slots:1 kept=1
Partition:5 rows:58 clusters:1 slots:1 kept=1
Partition:6 rows:74 clusters:1 slots:1 kept=1
Partition:7 rows:57 clusters:1 slots:1 kept=1
kept=1:表示該分割槽在記憶體中,如果kept=0表示分割槽表在磁碟中。
Final number of hash buckets: 1024
--hash表由1024個hash bucket來管理
3、hash表的具體存放資訊:
645+282+77+18+2 =1024
### Hash table ###
Number of buckets with 0 rows: 645
Number of buckets with 1 rows: 282
Number of buckets with 2 rows: 77
Number of buckets with 3 rows: 18
Number of buckets with 4 rows: 2
Number of buckets with 5 rows: 0
Number of buckets with 6 rows: 0
Number of buckets with 7 rows: 0
Number of buckets with 8 rows: 0
Number of buckets with 9 rows: 0
Number of buckets with between 10 and 19 rows: 0
Number of buckets with between 20 and 29 rows: 0
Number of buckets with between 30 and 39 rows: 0
Number of buckets with between 40 and 49 rows: 0
Number of buckets with between 50 and 59 rows: 0
Number of buckets with between 60 and 69 rows: 0
Number of buckets with between 70 and 79 rows: 0
Number of buckets with between 80 and 89 rows: 0
Number of buckets with between 90 and 99 rows: 0
Number of buckets with 100 or more rows: 0
--hash表由hash bucket進行管理,從上面資訊我們可以知道500行資料具體分佈資訊:
有282個hash bucket包含1行資料
有77個hash bucket包含2行資料
有18個hash bucket包含3行資料
有2個hash bucket包含4行資料
hash bucket數量=282+77+18+2 = 379
如果hash bucket分佈異常不平均,如某個hash bucket所包含的行數特別多,有可能是小表中參與hash計算join columns的重複的值太多造成,需要重寫語句,剔除該重複值,因為hash bucket下所包含的行數越多,消耗的CPU資源越大。
4、hash表的統計資訊:
Total buckets: 1024 Empty buckets: 645 Non-empty buckets: 379
Total number of rows: 500
Maximum number of rows in a bucket: 4
Average number of rows in non-empty buckets: 1.319261
5、大表的使用bitmap進行匹配過濾資訊
Used bitmap filtering: filtered rows=7 minimum required=50 out f=1000
Used bitmap filtering: filtered rows=114 minimum required=50 out f=1000
Used bitmap filtering: filtered rows=258 minimum required=50 out f=1000
Used bitmap filtering: filtered rows=427 minimum required=50 out f=1000
.....................................................
6、以上Optimal工作機制描述
A、先將hash area size 空間分為三部分,第一部分是ORACLE內部管理記憶體;第二部分是將記憶體的hash table分為8個分割槽表,hash table 由hash bucket管理,第三部分是bitmap表;
B、小表在記憶體中構建hash表,先將join columns的數值進行hash function計算,對應的值為hash bucket,如以上案例,進行hash function計算,500行資料,需要379個hash buckets來管理,我手工計算為376個,不知道為什麼計算偏差3個。小表中所需的columns存放到記憶體hash table。hash bucket其所對應的bitmap設定為1。
C、大表在與小表進行hash join時候,先將join columns進行相同的hash function計算,計算結果與bitmap點陣圖進行比對,如果該點陣圖的bit=0,表示對應的hash bucket所管理的記憶體不存在小表rows,因此直接將該行拋棄,如果bit=1,則在對應的hash bucket中找到對應的儲存小錶行,與大表的行按照join columns條件,進行實際列數值匹配,如果匹配,表示該行符合查詢條件,如果不匹配,則直接丟棄。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/354732/viewspace-623359/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 通過10104閱讀hash join工作機制 ---Multipass
- 通過10104閱讀hash join工作機制 ---OnePass
- 通過swap_join_inputs來控制多表連線hash join中的build tableUI
- ORACLE Hash JoinOracle
- 通過分析 JDK 原始碼研究 Hash 儲存機制JDK原始碼
- HASH JOIN ,MERGE JOIN ,NESTED LOOPOOP
- HASH join詳解
- nested loop,sort merge join,hash joinOOP
- Mysql join 的本質,Nested Loop Join 和 Hash JoinMySqlOOP
- 通過兩個案例初步瞭解Linux下selinux的安全機制工作機制Linux
- 如何通過閱讀文件,構建概念模型?模型
- hash join\nest loop join\sort merge join的實驗OOP
- HASH JOIN ,MERGE JOIN ,NESTED LOOP(R2)OOP
- HASH JOIN ,MERGE JOIN ,NESTED LOOP的比較OOP
- 【譯】通過閱讀原始碼來提高 JS 知識原始碼JS
- 閱讀原始碼,通過LinkedList回顧基礎原始碼
- Hash join演算法原理演算法
- Hash join演算法原理(轉)演算法
- Oracle中的Hash Join祥解Oracle
- Oracle 的 hash join連線方式Oracle
- oracle hash join演算法原理Oracle演算法
- Oracle中的Hash Join詳解Oracle
- Data Warehourse Guide閱讀筆記(五):Bitmap join indexGUIIDE筆記Index
- oracle工作機制(1)Oracle
- oracle工作機制(2)Oracle
- ORACLE的工作機制Oracle
- oracle工作機制(轉)Oracle
- SPOJ - OPTM Optimal Marks(進位制拆分+最小割)
- oracle hash join原理及注意事項Oracle
- Oracle中的Hash Join詳解 ztOracle
- 表的連線方式:NESTED LOOP、HASH JOIN、SORT MERGE JOIN(轉)OOP
- MapReduce之MapTask工作機制APT
- oracle工作機制導圖Oracle
- ORACLE的工作機制-1Oracle
- ORACLE的工作機制-2Oracle
- ORACLE的工作機制-3Oracle
- ORACLE的工作機制-4Oracle
- ORACLE的工作機制-5Oracle