_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優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- 執行計劃-1:獲取執行計劃
- 分析執行計劃優化SQLORACLE的執行計劃(轉)優化SQLOracle
- 【執行計劃】Oracle獲取執行計劃的幾種方法Oracle
- 獨家揭秘丨GreatSQL 的MDL鎖策略升級對執行的影響SQL
- 中美貿易談判對雲端計算行業的影響行業
- Linux讀寫執行許可權對目錄和檔案的影響Linux
- MySQL執行計劃MySql
- SYBASE執行計劃
- MySQL 執行計劃MySql
- 怎麼減少行鎖對效能的影響?
- 物聯網對醫療行業的影響行業
- 伺服器的容錯性對伺服器執行有什麼影響伺服器
- Oceanbase 和 TiDB 粗淺對比之 - 執行計劃TiDB
- SqlServer的執行計劃如何分析?SQLServer
- sqm執行計劃的繫結
- return與finally的執行順序的影響(skycto JEEditor)
- MySQL執行計劃解析MySql
- mysql explain 執行計劃MySqlAI
- explain執行計劃分析AI
- mysql執行計劃explainMySqlAI
- oracle 固定執行計劃Oracle
- Oracle sql執行計劃OracleSQL
- 執行計劃執行步驟原則
- OpenAI Sora對遊戲行業影響最大OpenAISora遊戲行業
- 【PG執行計劃】Postgresql資料庫執行計劃統計資訊簡述SQL資料庫
- 按行業劃分的COVID-19疫情對B2B行業的影響【附原資料表】行業
- 突然斷電,是否會影響Mysql的執行結果MySql
- 影響獨立伺服器穩定執行的因素伺服器
- 色彩心理學對網頁設計的影響力網頁
- Oracle檢視執行計劃的命令Oracle
- 如何檢視SQL的執行計劃SQL
- SQLSERVER中得到執行計劃的方式SQLServer
- CSS3實現動畫不會影響主執行緒,JS實現動畫會影響主執行緒CSSS3動畫執行緒JS
- 12張圖讀懂疫情對銀行業的影響行業
- ClubIntel:Y世代和Z世代對健身行業的影響Intel行業
- mongodb執行計劃解釋MongoDB