測試在cursor_sharing為force情況下執行計劃的共享情況
1、首先,我們確定cursor_sharing引數
SQL> show parameter cursor_sharing
NAME TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
cursor_sharing string
FORCE
SQL> select spid from v$process where addr in(select paddr from v$session where
sid in(select sid from v$mystat where rownum=1));
SPID
------------
8392
2、測試常量發生變化時,執行計劃的共享情況
SQL> alter session set sql_trace=true;
Session altered.
SQL> select * from tb_test_connect_by where id=4;
no rows selected
SQL> select * from tb_test_connect_by where id=5;
ID
----------
5
SQL> select * from tb_test_connect_by where id=6;
ID
----------
6
SQL> alter session set sql_trace off
2 ;
alter session set sql_trace off
*
ERROR at line 1:
ORA-00922: missing or invalid option
SQL> alter session set sql_trace=off;
alter session set sql_trace=off
*
ERROR at line 1:
ORA-00922: missing or invalid option
SQL> alter session set sql_trace=false;
Session altered.
trace結果:
.....
select *
from
tb_test_connect_by where id=:"SYS_B_0"
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 4 0.00 0.01 0 0 0 0
Execute 4 0.00 0.00 0 0 0 0
Fetch 5 0.00 0.00 0 3 0 2
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 13 0.00 0.01 0 3 0 2
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61
Rows Row Source Operation
------- ---------------------------------------------------
0 INDEX UNIQUE SCAN SYS_C0025401 (cr=1 pr=0 pw=0 time=24 us)(object id 57978)
.....
從上面的分析結果來看,在cursor_sharing為force時,確實會把常量替換成一個系統自帶的繫結變數,這樣,就可以減少硬解析次數,只是當列的值有傾斜時,可能會導致執行計劃出現問題。
3、測試在繫結變數名稱不一樣的情況下,執行計劃的共享情況
SQL> alter session set sql_trace=true;
Session altered.
SQL> variable id number;
SQL> variable id10 number;
SQL> variable id11 number;
SQL> exec :id=1;
BEGIN :id=1; END;
*
ERROR at line 1:
ORA-06550: line 1, column 10:
PLS-00103: Encountered the symbol "=" when expecting one of the following:
:= . ( @ % ; indicator
The symbol ":= was inserted before "=" to continue.
SQL> exec :id:=1
PL/SQL procedure successfully completed.
SQL> exec :id10:=2
PL/SQL procedure successfully completed.
SQL> exec :id11:=3
PL/SQL procedure successfully completed.
SQL> select * from tb_test_connect_by where id=:id;
ID
----------
1
SQL> select * from tb_test_connect_by where id=:id10;
ID
----------
2
SQL> select * from tb_test_connect_by where id=:id11;
ID
----------
3
SQL> alter session set sql_trace=false;
Session altered.
trace檔案:
......
select *
from
tb_test_connect_by where id=:id
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.04 0 0 0 0
Fetch 2 0.00 0.00 0 1 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.04 0 1 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61
Rows Row Source Operation
------- ---------------------------------------------------
1 INDEX UNIQUE SCAN SYS_C0025401 (cr=1 pr=0 pw=0 time=79 us)(object id 57978)
********************************************************************************
select *
from
tb_test_connect_by where id=:id10
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.01 0 0 0 0
Fetch 2 0.00 0.00 0 1 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.01 0 1 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61
Rows Row Source Operation
------- ---------------------------------------------------
1 INDEX UNIQUE SCAN SYS_C0025401 (cr=1 pr=0 pw=0 time=16 us)(object id 57978)
********************************************************************************
select *
from
tb_test_connect_by where id=:id11
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.01 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 1 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.01 0 1 0 1
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61
Rows Row Source Operation
------- ---------------------------------------------------
1 INDEX UNIQUE SCAN SYS_C0025401 (cr=1 pr=0 pw=0 time=28 us)(object id 57978)
.....
從測試結果分析來看,當繫結變數的名稱不一樣時,即使在cursor_sharing為force的情況一下,執行計劃也是無法共享的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12350275/viewspace-690250/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 什麼情況下進行效能測試
- 不應該在沒有 sudo 的情況下執行 Docker 的原因Docker
- 如何模擬在丟包情況下的傳輸測試(以鐳速為例)
- 成都現在的情況
- 無GPU情況下對cuda程式進行功能性測試GPU
- ORACLE expdp在表空間較多的情況下執行非常緩慢Oracle
- (轉)有return的情況下try catch finally的執行順
- 有return的情況下try catch finally的執行順序
- 返回值為空的情況下的單測書寫
- 4.3.4.1 在不使用Oracle OMF的情況下建立CDBOracle
- 在不影響程式使用的情況下新增shellcode
- 在不重啟的情況下為 Vmware Linux 客戶機新增新硬碟Linux硬碟
- [20231024]NULL值在索引的情況.txtNull索引
- 在不安裝oracle客戶端的情況下,使用PLSQLOracle客戶端SQL
- if 判斷為 false 的 6 種情況False
- 沒有介面文件的情況下如何開展介面自動化測試?
- 測試需要連線外網,這種情況下如何模擬弱網測試
- 在沒有本地安裝的情況下在 Postman 上測試您的端點Postman
- 請在這幾種情況下匯入TPM管理
- mysql索引失效的情況MySql索引
- NoClassDefFoundError的兩種情況Error
- JPA EntityManager 在沒有實體類的情況下返回Map
- 在不需要知道密碼的情況下 Hacking MSSQL密碼SQL
- 開始使用 Org 模式吧,在沒有 Emacs 的情況下模式Mac
- 情況最簡單下的爬蟲案例爬蟲
- xcodebuild -workspace 情況下,部分坑的處理XCodeUI
- Qt 彈出的子頁面在未關閉的情況下,關閉主窗體,程式不退出的情況解決QT
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況(網路的情況).txt
- 測試在丟失歸檔日誌的情況下,跳過部分歸檔日誌進行資料恢復資料恢復
- Linux TCP RST情況LinuxTCP
- 什麼情況下你能接受 996996
- 哪些情況下企業需要部署CRM?
- 您的主機不滿足在啟用Hyper-V的情況下執行VMware player的最低要求
- 什麼情況!華為開源JDK!JDK
- gorm使用事務併發情況下切有最大mysql連線數限制的情況下的BUG,踩坑了GoORMMySql
- charles 在只支援 tls1.3 的 nginx 情況下如何抓包?TLSNginx
- DOM對映的特殊情況
- AMD MPSoC PS PCIe作為EP與Host在異常狀態下的工作情況
- ubuntu 下解決埠被佔用的情況Ubuntu