巢狀表的測試(二)
在上一次的測試中,通過加入巢狀表table(column_map)的查詢,才能在查詢中直接顯示所有表格的欄位資料。
進過對執行計劃的檢查,發現一些其他資訊如下:
SQL> explain plan for
2 select c.rowid,
3 e.rowid,
4 e.id,
5 c.*
6 from mc$etl_reference e,
7 table(e.column_map) c;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
——————————————————————————–
Plan hash value: 3677997364
——————————————————————————–
| Id | Operation | Name | Rows | Bytes |
——————————————————————————–
| 0 | SELECT STATEMENT | | 7 | 637 |
| 1 | NESTED LOOPS | | | |
| 2 | NESTED LOOPS | | 7 | 637 |
| 3 | TABLE ACCESS FULL | MC$ETL_REFERENCE | 3 | 105 |
|* 4 | INDEX RANGE SCAN | SYS_FK0000091705N00002$ | 2 | |
| 5 | TABLE ACCESS BY INDEX ROWID| MC$COLUMN_MAP1 | 2 | 112 |
——————————————————————————–
Predicate Information (identified by operation id):
—————————————————
4 – access("C"."NESTED_TABLE_ID"="E"."SYS_NC0000200003$")
Note
—–
PLAN_TABLE_OUTPUT
——————————————————————————–
– dynamic sampling used for this statement (level=2)
實際的執行計劃中,引用到了MC$COLUMN_MAP1這張表格的資料,而這張表還有nested_table_id欄位,是未被手工定義的,看來是oracle自帶的巢狀表欄位,檢查巢狀表的資料字典:
SQL> select index_name,table_name,column_name from user_ind_columns where index_name='SYS_FK0000091705N00002$';
INDEX_NAME TABLE_NAME COLUMN_NAME
—————————— —————————— ——————————————————————————–
SYS_FK0000091705N00002$ MC$COLUMN_MAP1 NESTED_TABLE_ID
SQL> select table_name,column_name,data_type,column_id from user_nested_table_cols;
TABLE_NAME COLUMN_NAME DATA_TYPE COLUMN_ID
—————————— —————————— ——————————————————————————– ———-
MC$COLUMN_MAP1 SYS_NC_ROWINFO$ MC$COLUMN_OBJ_TYPE1
MC$COLUMN_MAP1 NESTED_TABLE_ID RAW
MC$COLUMN_MAP1 COLUMN_SOURCE VARCHAR2 1
MC$COLUMN_MAP1 COLUMN_NAME VARCHAR2 2
可見SYS_NC_ROWINFO$,NESTED_TABLE_ID都屬於隱含欄位,並不存在column_id。
檢視nested_table_id的內容,如下:
SQL> select c.rowid,
2 e.rowid,
3 e.id,
4 c.*,
5 C.NESTED_TABLE_ID
6 from mc$etl_reference e,
7 table(e.column_map) c;
ROWID ROWID ID COUMN_SOURCE COLUMN_NAME NESTED_TABLE_ID
—————— —————— ———- — – ——————————————————————————————————–
AAAWY6AAEAAAADeAAA AAAWY5AAEAAAADuAAA 1 a b C09A5DBA8BCF4D2BBFF5454C7AAFC363
AAAWY6AAEAAAADeAAB AAAWY5AAEAAAADuAAA 1 c d C09A5DBA8BCF4D2BBFF5454C7AAFC363
AAAWY6AAEAAAADeAAC AAAWY5AAEAAAADuAAB 2 e f 572048408CD4459EA8AEC2D18C9E0614
AAAWY6AAEAAAADeAAD AAAWY5AAEAAAADuAAB 2 g h 572048408CD4459EA8AEC2D18C9E0614
AAAWY6AAEAAAADfAAA AAAWY5AAEAAAADvAAA 3 e1 f1 7224843C16AE42AEA8B50FFB06751143
AAAWY6AAEAAAADfAAB AAAWY5AAEAAAADvAAA 3 g1 h1 7224843C16AE42AEA8B50FFB06751143
AAAWY6AAEAAAADfAAC AAAWY5AAEAAAADvAAA 3 A1 C1 7224843C16AE42AEA8B50FFB06751143
可見雖然MC$COLUMN_MAP1 每行的rowid不一樣,但是對應到mc$etl_reference 的nested_table_id倒是和mc$etl_reference 有一一對應的關係。
那麼看來通過
SQL> select e.id, c.* from mc$etl_reference e, table(e.column_map) c;
ID COLUMN_SOURCE COLUMN_NAME
———- —————————— ——————————
1 a b
1 c d
2 e f
2 g h
3 e1 f1
3 g1 h1
3 A1 C1
7 rows selected
來讀取全部資料確實是合理的,而且在執行計劃上總體來說,就是先讀取每行mc$etl_reference的id和NESTED_TABLE_ID
通過NESTED_TABLE_ID到相關巢狀表讀出每行資料,然後返回輸出。
因為NESTED_TABLE_ID和mc$etl_reference.rowid有一一對應關係。所以這樣讀出的資料是正確的,並不會產生無序的笛卡爾積。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10009036/viewspace-1061456/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 巢狀表的測試(一)巢狀
- JUnit5的條件測試、巢狀測試、重複測試巢狀
- C++ 巢狀類簡單測試C++巢狀
- oracle巢狀表Oracle巢狀
- Oracle 巢狀表Oracle巢狀
- PLSQL Language Referenc-巢狀表-巢狀表和陣列間的重要區別(正確地使用巢狀表)SQL巢狀陣列
- Oracle 巢狀表(轉)Oracle巢狀
- Oracle的表連線方法(二)巢狀迴圈連線Oracle巢狀
- oracle 巢狀表 索引表 使用Oracle巢狀索引
- oracle 雜湊查詢與巢狀查詢跟表的先後關係測試Oracle巢狀
- Java測試內部類和巢狀類位置的合法性Java巢狀
- 巢狀表段的等同分割槽巢狀
- element-ui的----el-form表單校驗巢狀表單校驗(表單多層巢狀)+el-table和el-form巢狀使用表單校驗UIORM巢狀
- 巢狀表在表定義中的使用:一個例子巢狀
- 集合的巢狀巢狀
- 盒子的巢狀巢狀
- 巢狀評論的資料庫表設計巢狀資料庫
- 集合框架-集合的巢狀遍歷(HashMap巢狀HashMap)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(HashMap巢狀ArrayList)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(ArrayList巢狀HashMap)框架巢狀HashMap
- 集合框架-集合的巢狀遍歷(多層巢狀)框架巢狀
- 小程式巢狀H5的方式和技巧(二)巢狀H5
- iterate的巢狀使用巢狀
- vue elementUI 表單校驗(多層巢狀)VueUI巢狀
- less巢狀巢狀
- Datalist巢狀巢狀
- 兩表連線一:巢狀迴圈連線巢狀
- html的巢狀規則HTML巢狀
- 【react】實現動態表單中巢狀動態表單React巢狀
- vue路由巢狀Vue路由巢狀
- angular 巢狀路由Angular巢狀路由
- 迴圈_巢狀巢狀
- 列表巢狀操作巢狀
- 評論表設計 - 路徑列舉、巢狀集、閉包表巢狀
- golang的巢狀事務管理Golang巢狀
- 各種檢視的巢狀巢狀
- JavaScript中if巢狀assert的方法JavaScript巢狀
- vue的元件巢狀關係Vue元件巢狀