cursor_sharing設定為similar 的弊端
將cursor_sharing設定為similar會產生許多問題:
1、對於語句中包含的範圍查詢(如between,
2、影響 Adaptive Cursor sharing特性和CBO最佳化器
3、Similar可能產生的一個父遊標, 多個子遊標,其效能比多個父遊標情況更加糟
糕(EXACT或 FORCE);
對於第一個,我們做實驗如下:
1 修改引數,建表,統計資訊
yang@rac1>alter session set cursor_sharing=similar;
Session altered.
yang@rac1>create table t_cur_sh as
2 select rownum id ,
3 dbms_random.string('s',12) val
4 from dual
5 connect by level <1e3;
Table created.
yang@rac1>begin
2 dbms_stats.gather_table_stats(
3 user,
4 'T_CUR_SH',
5 cascade=>true,
6 estimate_percent=>null,
7 method_opt=>'for all columns size 1');
8 end;
9 /
PL/SQL procedure successfully completed.
2 進行等值測試
yang@rac1>@/tmp/t.sql
select /*+yang */ count(1) from t_cur_sh where id=1;
select /*+yang */ count(1) from t_cur_sh where id=2;
select /*+yang */ count(1) from t_cur_sh where id=3;
select /*+yang */ count(1) from t_cur_sh where id=4;
select /*+yang */ count(1) from t_cur_sh where id=5;
select /*+yang */ count(1) from t_cur_sh where id=6;
select /*+yang */ count(1) from t_cur_sh where id=7;
select /*+yang */ count(1) from t_cur_sh where id=8;
select /*+yang */ count(1) from t_cur_sh where id=9;
select /*+yang */ count(1) from t_cur_sh where id=10;
--檢視子游標的資訊:現在是2個子遊標
select count(hash_value) copies,
substrb(sql_text,1,80) sql_text
from v$sql
where substrb(sql_text,1,80) like '%yang%'
group by substrb(sql_text,1,80)
order by copies asc
/
COPIES SQL_TEXT
---------- --------------------------------------------------------------------------------
2 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
yang@rac1>select
2 hash_value, IS_OBSOLETE,
3 IS_BIND_SENSITIVE,
4 IS_SHAREABLE,
5 substrb(SQL_TEXT,1 ,80) SQL_TEXT
6 from v$sql
7 where substrb(sql_text,1,80) like '%yang%';
HASH_VALUE I I I SQL_TEXT
---------- - - ------------------------------------------------------------
3475970911 N N Yselect /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3475970911 N N Yselect /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
上面三個 I 分別是:
是否繫結敏感(is_bind_sensitive):不僅指出是否使用繫結變數窺測來生成執行計劃,而且指出這個執行計劃是否依賴於窺測到的值。如果是,這個欄位會被設定為Y,否則會被設定為N。
是否繫結可知(is_bind_aware):表明遊標是否使用了擴充套件的遊標共享。如果是,這個欄位會被設定為Y,如果不是,這個欄位會被設定為N。如果是設定為N,這個遊標將被廢棄,不再可用。
是否可共享(is_shareable):表明遊標能否被共享。如果可以,這個欄位會被設定為Y,否則,會被設定為N。如果被設定為N,這個遊標將被廢棄,不再可用
這裡
IS_OBSOLETE = N
IS_BIND_SENSITIVE=N
IS_SHAREABLE=Y --遊標是可以共享的。
再看一個例子:不等值的情況下使用 similar的情況:
yang@rac1>@/tmp/t2.sql
t2.sql
select /*+yang */ count(1) from t_cur_sh where id<2;
select /*+yang */ count(1) from t_cur_sh where id<3;
select /*+yang */ count(1) from t_cur_sh where id<4;
select /*+yang */ count(1) from t_cur_sh where id<5;
select /*+yang */ count(1) from t_cur_sh where id<6;
select /*+yang */ count(1) from t_cur_sh where id<7;
select /*+yang */ count(1) from t_cur_sh where id<8;
select /*+yang */ count(1) from t_cur_sh where id<9;
select /*+yang */ count(1) from t_cur_sh where id<10;
select count(hash_value) copies,
substrb(sql_text,1,80) sql_text
from v$sql
where substrb(sql_text,1,80) like '%yang%'
group by substrb(sql_text,1,80)
order by copies asc
/
COPIES SQL_TEXT
---------- -------------------------------------------------------------------------------
2 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
9 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<: style="color: rgb(255, 1, 2);">9個子遊標
沒有充分共享,所以在範圍查詢和直方圖統計中不適合設定similar,
yang@rac1>select
2 hash_value, IS_OBSOLETE,
3 IS_BIND_SENSITIVE,
4 IS_SHAREABLE,
5 substrb(SQL_TEXT,1 ,80) SQL_TEXT
6 from v$sql
7 where substrb(sql_text,1,80) like '%yang%';
HASH_VALUE I I I SQL_TEXT
---------- - - -------------------------------------------------------------------
3475970911 N N Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3475970911 N N Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>11 rows selected.
IS_OBSOLETE = N
IS_BIND_SENSITIVE=N --不敏感,如果是設定為N,這個遊標將被廢棄,不再可用。
IS_SHAREABLE=Y
1、對於語句中包含的範圍查詢(如between,
2、影響 Adaptive Cursor sharing特性和CBO最佳化器
3、Similar可能產生的一個父遊標, 多個子遊標,其效能比多個父遊標情況更加糟
糕(EXACT或 FORCE);
對於第一個,我們做實驗如下:
1 修改引數,建表,統計資訊
yang@rac1>alter session set cursor_sharing=similar;
Session altered.
yang@rac1>create table t_cur_sh as
2 select rownum id ,
3 dbms_random.string('s',12) val
4 from dual
5 connect by level <1e3;
Table created.
yang@rac1>begin
2 dbms_stats.gather_table_stats(
3 user,
4 'T_CUR_SH',
5 cascade=>true,
6 estimate_percent=>null,
7 method_opt=>'for all columns size 1');
8 end;
9 /
PL/SQL procedure successfully completed.
2 進行等值測試
yang@rac1>@/tmp/t.sql
select /*+yang */ count(1) from t_cur_sh where id=1;
select /*+yang */ count(1) from t_cur_sh where id=2;
select /*+yang */ count(1) from t_cur_sh where id=3;
select /*+yang */ count(1) from t_cur_sh where id=4;
select /*+yang */ count(1) from t_cur_sh where id=5;
select /*+yang */ count(1) from t_cur_sh where id=6;
select /*+yang */ count(1) from t_cur_sh where id=7;
select /*+yang */ count(1) from t_cur_sh where id=8;
select /*+yang */ count(1) from t_cur_sh where id=9;
select /*+yang */ count(1) from t_cur_sh where id=10;
--檢視子游標的資訊:現在是2個子遊標
select count(hash_value) copies,
substrb(sql_text,1,80) sql_text
from v$sql
where substrb(sql_text,1,80) like '%yang%'
group by substrb(sql_text,1,80)
order by copies asc
/
COPIES SQL_TEXT
---------- --------------------------------------------------------------------------------
2 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
yang@rac1>select
2 hash_value, IS_OBSOLETE,
3 IS_BIND_SENSITIVE,
4 IS_SHAREABLE,
5 substrb(SQL_TEXT,1 ,80) SQL_TEXT
6 from v$sql
7 where substrb(sql_text,1,80) like '%yang%';
HASH_VALUE I I I SQL_TEXT
---------- - - ------------------------------------------------------------
3475970911 N N Yselect /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3475970911 N N Yselect /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
上面三個 I 分別是:
是否繫結敏感(is_bind_sensitive):不僅指出是否使用繫結變數窺測來生成執行計劃,而且指出這個執行計劃是否依賴於窺測到的值。如果是,這個欄位會被設定為Y,否則會被設定為N。
是否繫結可知(is_bind_aware):表明遊標是否使用了擴充套件的遊標共享。如果是,這個欄位會被設定為Y,如果不是,這個欄位會被設定為N。如果是設定為N,這個遊標將被廢棄,不再可用。
是否可共享(is_shareable):表明遊標能否被共享。如果可以,這個欄位會被設定為Y,否則,會被設定為N。如果被設定為N,這個遊標將被廢棄,不再可用
這裡
IS_OBSOLETE = N
IS_BIND_SENSITIVE=N
IS_SHAREABLE=Y --遊標是可以共享的。
再看一個例子:不等值的情況下使用 similar的情況:
yang@rac1>@/tmp/t2.sql
t2.sql
select /*+yang */ count(1) from t_cur_sh where id<2;
select /*+yang */ count(1) from t_cur_sh where id<3;
select /*+yang */ count(1) from t_cur_sh where id<4;
select /*+yang */ count(1) from t_cur_sh where id<5;
select /*+yang */ count(1) from t_cur_sh where id<6;
select /*+yang */ count(1) from t_cur_sh where id<7;
select /*+yang */ count(1) from t_cur_sh where id<8;
select /*+yang */ count(1) from t_cur_sh where id<9;
select /*+yang */ count(1) from t_cur_sh where id<10;
select count(hash_value) copies,
substrb(sql_text,1,80) sql_text
from v$sql
where substrb(sql_text,1,80) like '%yang%'
group by substrb(sql_text,1,80)
order by copies asc
/
COPIES SQL_TEXT
---------- -------------------------------------------------------------------------------
2 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
9 select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<: style="color: rgb(255, 1, 2);">9個子遊標
沒有充分共享,所以在範圍查詢和直方圖統計中不適合設定similar,
yang@rac1>select
2 hash_value, IS_OBSOLETE,
3 IS_BIND_SENSITIVE,
4 IS_SHAREABLE,
5 substrb(SQL_TEXT,1 ,80) SQL_TEXT
6 from v$sql
7 where substrb(sql_text,1,80) like '%yang%';
HASH_VALUE I I I SQL_TEXT
---------- - - -------------------------------------------------------------------
3475970911 N N Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3475970911 N N Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id=:"SYS_B_1"
3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>3690020262 N Y Y select /*+yang */ count(:"SYS_B_0") from t_cur_sh where id<:>11 rows selected.
IS_OBSOLETE = N
IS_BIND_SENSITIVE=N --不敏感,如果是設定為N,這個遊標將被廢棄,不再可用。
IS_SHAREABLE=Y
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-690985/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 11g 中 cursor_sharing 設定為SIMILAR 導致的問題OracleMILA
- CURSOR_SHARING=SIMILARMILA
- 關於 cursor_sharing = similarMILA
- cursor_sharing=similar深度剖析MILA
- cursor_sharing : exact , force , similarMILA
- 關於cursor_sharing=similarMILA
- 10203設定CURSOR_SHARING為SIMILAR導致物化檢視重新整理失敗MILA
- 關於cursor_sharing = similar(ZT)MILA
- ANNOUNCEMENT: Deprecating the cursor_sharing = ‘SIMILAR’MILA
- 關於cursor_sharing = similar (zt)MILA
- cursor_sharing = similar , exact 區別MILA
- cursor_sharing=similar 與 直方圖MILA直方圖
- 有關引數cursor_sharing=similar的測試MILA
- Cursor_sharing=SIMILAR取值與直方圖(上)MILA直方圖
- Cursor_sharing=SIMILAR取值與直方圖(下)MILA直方圖
- oracle實驗記錄 (cursor_sharing(2)SIMILAR)OracleMILA
- [20140802]cursor_sharing=similar.txtMILA
- 小心設定cursor_sharing=force引數
- 補充:小心設定cursor_sharing=force引數
- SAP QM 模組的弊端?
- 如何為Kafka叢集確定合適的分割槽數以及分割槽數過多帶來的弊端Kafka
- Fedora怎麼設定DVD為yum源?Fedora設定DVD為yum源的方法
- 為listener設定口令!
- 為YUM設定代理的方法 ccproxy
- 為什麼索引的PCTUSED被設定為0索引
- 設定鎖定預設瀏覽器為IE瀏覽器
- 深究免費代理ip的弊端
- 同步的特點,好處,弊端
- win10電腦 tls安全設定怎麼設定為預設設定Win10TLS
- 為終端設定代理
- 自定義滑鼠設定-中鍵設定為後退
- 免費HTTP代理的三大弊端HTTP
- 客戶端JavaScript的5個弊端客戶端JavaScript
- 設定 Teredo 伺服器,預設為:伺服器
- cursor_sharing為force時帶來的一個執行計劃的假象
- 為Tomcat設定自己的管理賬號Tomcat
- font-size設定為100%的作用
- 為jQuery的$.ajax設定超時時間jQuery