_complex_view_merging對執行計劃的影響
以下是在10.2.0.1版本下測試,以下實驗來著於Jonathan Lewis 《CBO》。
1、建立測試表
SQL>create table t1 (
id_par number(6) not null,
vc1 varchar2(32) not null,
vc2 varchar2(32) not null,
padding varchar2(100)
);
SQL>alter table t1 add constraint t1_pk primary key (id_par);
SQL>create table t2 (
id_ch number(6) not null,
id_par number(6) not null,
val number(6,2),
padding varchar2(100)
);
SQL>alter table t2 add constraint t2_pk primary key (id_ch);
SQL>alter table t2 add constraint t2_fk_t1 foreign key (id_par) references t1;
2、插入測試資料
SQL>insert into t1
select
rownum,
vc1,
vc2,
rpad('x',100)
from
(
select
lpad(trunc(sqrt(rownum)),32) vc1,
lpad(rownum,32) vc2
from all_objects
where rownum <= 32
) ;
SQL>commit;
SQL>insert into t2
select
rownum,
d1.id_par,
rownum,
rpad('x',100)
from
t1 d1,
t1 d2
;
SQL>commit;
3、統計分析(略)
4、建立檢視
SQL>create or replace view avg_val_view AS
select
id_par, avg(val) avg_val_t1
from t2
group by id_par;
5、設定_complex_view_merging=true (預設)
SQL>set autotrace traceonly explain
SQL>select
t1.vc1, avg_val_t1
from
t1, avg_val_view
where
t1.vc2 = lpad(18,32)
and avg_val_view.id_par = t1.id_par;
執行計劃1:
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 23 | 2024 | 8 |
| 1 | HASH GROUP BY | | 23 | 2024 | 8 |
| 2 | NESTED LOOPS | | 32 | 2816 | 5 |
| 3 | TABLE ACCESS FULL | T2 | 1024 | 7168 | 4 |
|* 4 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 81 | 1 |
|* 5 | INDEX UNIQUE SCAN | T1_PK | 1 | | |
-----------------------------------------------------------------------
T1表與檢視avg_val_view中的T2表進行關聯,然後在hash group by。在9i版本是sort (group by)。該執行計劃進行復雜檢視合併。
如果不進行合併,希望執行計劃將按部就班,我們需要加no_merge hint
SQL>select
/*+ no_merge (avg_val_view) */
t1.vc1, avg_val_t1
from
t1, avg_val_view
where
t1.vc2 = lpad(18,32)
and avg_val_view.id_par = t1.id_par
執行計劃2:
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 95 | 9 |
| 1 | NESTED LOOPS | | 1 | 95 | 9 |
| 2 | VIEW | AVG_VAL_VIEW | 32 | 832 | 8 |
| 3 | HASH GROUP BY | | 32 | 224 | 8 |
| 4 | TABLE ACCESS FULL | T2 | 1024 | 7168 | 4 |
|* 5 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 69 | 1 |
|* 6 | INDEX UNIQUE SCAN | T1_PK | 1 | | |
-----------------------------------------------------------------------------
5、設定_complex_view_merging=false
無論是否加hint,執行計劃都與執行計劃2一致。我們加merge(avg_val_view) hint想使執行計劃變成執行計劃1是不可能的,因為該merge hint在引數_complex_view_merging=false失效。
1、建立測試表
SQL>create table t1 (
id_par number(6) not null,
vc1 varchar2(32) not null,
vc2 varchar2(32) not null,
padding varchar2(100)
);
SQL>alter table t1 add constraint t1_pk primary key (id_par);
SQL>create table t2 (
id_ch number(6) not null,
id_par number(6) not null,
val number(6,2),
padding varchar2(100)
);
SQL>alter table t2 add constraint t2_pk primary key (id_ch);
SQL>alter table t2 add constraint t2_fk_t1 foreign key (id_par) references t1;
2、插入測試資料
SQL>insert into t1
select
rownum,
vc1,
vc2,
rpad('x',100)
from
(
select
lpad(trunc(sqrt(rownum)),32) vc1,
lpad(rownum,32) vc2
from all_objects
where rownum <= 32
) ;
SQL>commit;
SQL>insert into t2
select
rownum,
d1.id_par,
rownum,
rpad('x',100)
from
t1 d1,
t1 d2
;
SQL>commit;
3、統計分析(略)
4、建立檢視
SQL>create or replace view avg_val_view AS
select
id_par, avg(val) avg_val_t1
from t2
group by id_par;
5、設定_complex_view_merging=true (預設)
SQL>set autotrace traceonly explain
SQL>select
t1.vc1, avg_val_t1
from
t1, avg_val_view
where
t1.vc2 = lpad(18,32)
and avg_val_view.id_par = t1.id_par;
執行計劃1:
-----------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 23 | 2024 | 8 |
| 1 | HASH GROUP BY | | 23 | 2024 | 8 |
| 2 | NESTED LOOPS | | 32 | 2816 | 5 |
| 3 | TABLE ACCESS FULL | T2 | 1024 | 7168 | 4 |
|* 4 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 81 | 1 |
|* 5 | INDEX UNIQUE SCAN | T1_PK | 1 | | |
-----------------------------------------------------------------------
T1表與檢視avg_val_view中的T2表進行關聯,然後在hash group by。在9i版本是sort (group by)。該執行計劃進行復雜檢視合併。
如果不進行合併,希望執行計劃將按部就班,我們需要加no_merge hint
SQL>select
/*+ no_merge (avg_val_view) */
t1.vc1, avg_val_t1
from
t1, avg_val_view
where
t1.vc2 = lpad(18,32)
and avg_val_view.id_par = t1.id_par
執行計劃2:
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 95 | 9 |
| 1 | NESTED LOOPS | | 1 | 95 | 9 |
| 2 | VIEW | AVG_VAL_VIEW | 32 | 832 | 8 |
| 3 | HASH GROUP BY | | 32 | 224 | 8 |
| 4 | TABLE ACCESS FULL | T2 | 1024 | 7168 | 4 |
|* 5 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 69 | 1 |
|* 6 | INDEX UNIQUE SCAN | T1_PK | 1 | | |
-----------------------------------------------------------------------------
5、設定_complex_view_merging=false
無論是否加hint,執行計劃都與執行計劃2一致。我們加merge(avg_val_view) hint想使執行計劃變成執行計劃1是不可能的,因為該merge hint在引數_complex_view_merging=false失效。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/354732/viewspace-622055/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cluster factor對執行計劃的影響
- 索引及排序對執行計劃的影響索引排序
- oracle cardinality對於執行計劃的影響Oracle
- not-null約束對執行計劃的影響Null
- Oracle優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- 實驗-資料分佈對執行計劃的影響.txt
- CLUSTERING_FACTOR影響執行計劃
- 引數Optimizer_index_cost_adj 對執行計劃的影響Index
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 收集統計資訊中的no_invalidate選項對執行計劃的影響
- 再說索引與Null值對於Hints及執行計劃的影響索引Null
- 不等號影響執行計劃的相關實驗
- 表挪動儲存空間後,對之上的sql的執行計劃的影響的探究SQL
- try catch 對程式碼執行的效能影響
- db_file_multiblock_read_count引數對block讀取和執行計劃的影響BloC
- 執行緒數目對資料庫的影響執行緒資料庫
- 時區調整對job的執行時間的影響
- 影響執行計劃之oracle sql baseline與sql profile之互動OracleSQL
- 對一個執行計劃的疑問
- ORACLE SQL調優之執行計劃與隱藏引數_complex_view_mergingOracleSQLView
- arraysize/TDU/SDU的設定對sql執行代價的影響SQL
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- MySQL選用可重複讀之前一定要想到的事情(執行計劃影響)MySql
- 執行計劃-1:獲取執行計劃
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 獨家揭秘丨GreatSQL 的MDL鎖策略升級對執行的影響SQL
- 音樂對程式設計的影響程式設計
- 中美貿易談判對雲端計算行業的影響行業
- 淺析影響專案執行的因素
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 【Oracle】-【索引-HINT,執行計劃】-帶HINT的索引執行計劃Oracle索引
- 分析執行計劃最佳化SQLORACLE的執行計劃(轉)SQLOracle
- 執行計劃
- SQL的執行計劃SQL
- 執行計劃的理解.
- 淺析影響專案執行的因素(續)
- 雙下劃線開頭的記憶體引數對Oracle AMM行為的影響記憶體Oracle
- OpenAI Sora對遊戲行業影響最大OpenAISora遊戲行業