oracle 雜湊查詢與巢狀查詢跟表的先後關係測試
本次測試資料庫兩種連線型別雜湊連線與巢狀連線跟表的順序的關係;
構造兩個數量級別懸殊的兩個堆疊比表,透過hint來執行,實現不同的表的連線順序,檢查相應的執行計劃;
1、表的資訊:
表A1:100萬條記錄;
表A2:10條記錄;
2、執行的語句:
select * from wu.test4 b ,wu.test2 a where b.object_id=a.object_id
3、以上兩個表均收集了統計資訊;
2 兩表雜湊連線的測試
1、 使用A1(大表)做構造表,A2(小表)做探測表;(資料庫先執行A1,然後執行A2)
2、 使用A2做構造表,A1做探測表;(資料庫先執行A2,然後執行A1)
PLAN_TABLE_OUTPUT
Plan hash value: 3406100614
-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 174 | 17748 | | 10339 (1)| 00:02:05 |
|* 1 | HASH JOIN | | 174 | 17748 | 118M| 10339 (1)| 00:02:05 |
| 2 | TABLE ACCESS FULL| A1 | 1133K| 105M| | 4429 (1)| 00:00:54 |
| 3 | TABLE ACCESS FULL| A2 | 11 | 44 | | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 -
access("A1"."OBJECT_ID"="A2"."OBJECT_ID")
總結耗時:125S
PLAN_TABLE_OUTPUT
Plan
hash value: 1713954154
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 174 | 17748 | 4439 (1)| 00:00:54 |
|* 1 | HASH JOIN | | 174 | 17748 | 4439 (1)| 00:00:54 |
| 2 | TABLE ACCESS FULL| A2 | 11 | 44 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| A1 | 1133K| 105M| 4429 (1)| 00:00:54 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 -
access("A1"."OBJECT_ID"="A2"."OBJECT_ID")
總結總耗時:54S
3、 使用A1(大表)做構造表,A2(小表)做探測表;(資料庫先執行A1,然後執行A2)
4、 使用A2做構造表,A1做探測表;(資料庫先執行A2,然後執行A1)
指令碼:如下
EXPLAIN PLAN FOR
select /*+leading(A2 A1) use_Nl(A1) use_Nl(A2)*/*
from A1,A2
WHERE A1.OBJECT_ID=A2.OBJECT_ID
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 176 | 19712 | 51589 (2)| 00:10:20 |
| 1 | NESTED LOOPS | | 176 | 19712 | 51589 (2)| 00:10:20 |
| 2 | TABLE ACCESS FULL| A2 | 11 | 154 | 2 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| A1 | 16 | 1568 | 4690 (2)| 00:00:57 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("A1"."OBJECT_ID"="A2"."OBJECT_ID")
總結:耗時620S
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 176 | 19712 | 316K (1)| 01:03:17 |
| 1 | NESTED LOOPS | | 176 | 19712 | 316K (1)| 01:03:17 |
| 2 | TABLE ACCESS FULL| A1 | 1147K| 107M| 4691 (2)| 00:00:57 |
|* 3 | TABLE ACCESS FULL| A2 | 1 | 14 | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------
3 - filter("A1"."OBJECT_ID"="A2"."OBJECT_ID")
總結:耗時3600S以上;
1、 無論進行雜湊連線還是巢狀迴圈連線的時候,選擇結果小的表都要先執行;
2、 連線條件沒有選擇性的時候,雜湊連線的速度會比巢狀迴圈連線的速度快,因為雜湊連線只要執行一次就可以了,而巢狀迴圈連線需要執行多次(由外表的結果決定)
相關原理: 1. 一張小表被hash在記憶體中。因為資料量小,所以這張小表的大多數資料已經駐入在記憶體中,剩下的少量資料被放置在臨時表空間中;
2. 每讀取大表的一條記錄,就和小表中記憶體中的資料進行比較,如果符合,則立即輸出資料(也就是說沒有讀取臨時表空間中的小表的資料)。而如果大表的資料與小表中臨時表空間的資料相符合,則不直接輸出,而是也被儲存臨時表空間中。
3. 當大表的所有資料都讀取完畢,將臨時表空間中的資料以其輸出。 如果小表的資料量足夠小(小於hash area size),那所有資料就都在記憶體中了,可以避免對臨時表空間的讀寫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12679300/viewspace-764142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle表複雜查詢Oracle
- 對比SQL中簡單巢狀查詢與非巢狀查詢CFSQL巢狀
- 巢狀子查詢巢狀
- 查詢演算法及雜湊表演算法
- 字串查詢(字串雜湊)字串
- 巢狀關聯會查詢兩次巢狀
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 【PHP資料結構】雜湊表查詢PHP資料結構
- MySQL——優化巢狀查詢和分頁查詢MySql優化巢狀
- 雜湊查詢演算法演算法
- 雜湊查詢 兩數之和
- EleasticSearch6.0 巢狀查詢AST巢狀
- MyBatis(六) sql片段定義、級聯查詢、巢狀查詢MyBatisSQL巢狀
- 複雜查詢—子查詢
- es的複雜查詢測試,使用jest的dsl工具寫查詢語句
- LeetCode1002. 查詢常用字元(雜湊表、count)LeetCode字元
- Mysql 巢狀查詢100例子MySql巢狀
- es中如何使用巢狀物件查詢巢狀物件
- MySQL Oracle 查詢快慢和表的資料量多少有沒有關係?MySqlOracle
- oracle 例項表查詢Oracle
- Mysql中的巢狀子查詢問題QSBSMySql巢狀
- oracle表查詢的並行度Oracle並行
- Oracle 查詢Oracle
- 關於oracle的空間查詢Oracle
- Solr複雜查詢一:函式查詢Solr函式
- Mongodb 關聯表查詢MongoDB
- oracle 精確查詢和模糊查詢Oracle
- 呼叫鏈與日誌的關聯式跟蹤查詢
- 【資料結構】查詢結構(二叉排序樹、ALV樹、雜湊技術雜湊表)資料結構排序
- 資料結構實驗之查詢七:線性之雜湊表資料結構
- Oracle OCP(22):查詢表資訊Oracle
- Oracle psu查詢Oracle
- oracle 基本查詢Oracle
- oracle常用查詢Oracle
- SQL 複雜查詢SQL
- Oracle:優化方法總結(關於連表查詢)Oracle優化
- mysql三表關聯查詢MySql
- mysql 三表關聯查詢MySql
- Laravel Query Builder 複雜查詢案例:子查詢實現分割槽查詢 partition byLaravelUI