Grant許可權導致執行計劃失效
環境的建立:
ORACLE 9208
REM T1: Set up test case
var x number;
var y number;
create table bigtab as select * from all_objects;
create index bt_ix on bigtab (object_id);
execute dbms_stats.gather_table_stats (ownname=>'KONG', -
tabname=>'BIGTAB', CASCADE => TRUE, -
method_opt => 'FOR ALL COLUMNS SIZE 1');
[B]測試第一步:[/B]
在SESSION A中執行:
SQL> SELECT COUNT(*) FROM BIGTAB WHERE OBJECT_ID BETWEEN :x and :y;
COUNT(*)
----------
1
在SESSION B會話檢視執行計劃:
SQL> select sql_id, sql_text from v$sql
2 where sql_text like 'SELECT COUNT(*) FROM BIGTAB%';
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------
ddqk0yd13pa73
SELECT COUNT(*) FROM BIGTAB WHERE OBJECT_ID BETWEEN :x and :y
看到是執行計劃是走INDEX。
SQL> select operation, options, object_name from v$sql_plan where sql_id ='ddqk0yd13pa73';
OPERATION OPTIONS OBJECT_NAME
-------------------- -------------------- --------------------
SELECT STATEMENT
SORT AGGREGATE
FILTER
INDEX RANGE SCAN BT_IX
[B]測試第一步:[/B]
在SESSION A中,改變變數X 和Y的數值
SQL> begin :x := 0;
2 :y := 50000;
3 end;
4 /
PL/SQL procedure successfully completed.
SQL> SELECT COUNT(*) FROM BIGTAB WHERE OBJECT_ID BETWEEN :x and :y;
COUNT(*)
----------
40594
在SESSION B中檢視執行計劃,發現和第一步的執行計劃是一樣,沒有變化:
SQL> select sql_id, sql_text from v$sql
2 where sql_text like 'SELECT COUNT(*) FROM BIGTAB%';
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------
ddqk0yd13pa73
SELECT COUNT(*) FROM BIGTAB WHERE OBJECT_ID BETWEEN :x and :y
SQL> select operation, options, object_name from v$sql_plan where sql_id ='ddqk0yd13pa73';
OPERATION OPTIONS OBJECT_NAME
-------------------- -------------------- --------------------
SELECT STATEMENT
SORT AGGREGATE
FILTER
INDEX RANGE SCAN BT_IX
[B]測試第三步:[/B]
在SESSION A中,執行授權的操作:
SQL> GRANT SELECT ON BIGTAB TO ORDSYS;
Grant succeeded.
在SESSION B中,對V$SQL/ V$SQL_PLAN檢視查詢,發現沒有返回結果。
SQL> select sql_id, sql_text from v$sql
2 where sql_text like 'SELECT COUNT(*) FROM BIGTAB%';
no rows selected
SQL> select loads, invalidations, executions, version_count
2 from v$sqlarea where sql_id = 'ddqk0yd13pa73'
3 ;
no rows selected
SQL> select operation, options, object_name from v$sql_plan
2 where sql_id = 'ddqk0yd13pa73' order by plan_hash_value;
no rows selected
在grant之後,之前生產的執行計劃都已經失效!!在相關檢視找不到相關資訊!
[B]測試第四步:[/B]
在SESSION A中,重新載入查詢語句:
SQL> SELECT COUNT(*) FROM BIGTAB WHERE OBJECT_ID BETWEEN :x and :y;
COUNT(*)
----------
40594
在SESSION B 中,會發現執行計劃發生了改變,改為走“ FAST FULL SCAN” 。從現在開始不管是否用到了繫結變數都會走 FAST FULL SCAN。
SQL> select sql_id, sql_text from v$sql
2 where sql_text like 'SELECT COUNT(*) FROM BIGTAB%';
SQL_ID
-------------
SQL_TEXT
--------------------------------------------------------------------------------
ddqk0yd13pa73
SELECT COUNT(*) FROM BIGTAB WHERE OBJECT_ID BETWEEN :x and :y
SQL> select operation, options, object_name from v$sql_plan where sql_id ='ddqk0yd13pa73';
OPERATION OPTIONS OBJECT_NAME
-------------------- -------------------- --------------------
SELECT STATEMENT
SORT AGGREGATE
FILTER
INDEX FAST FULL SCAN BT_IX
看到執行計劃發生了變化!!改為FAST FULL SCAN 。許可權的改變導致執行計劃也發生了改變!!這是為什麼?
而且INVALIDATIONS 次數為 1
SQL> select loads, invalidations, executions, version_count
2 from v$sqlarea where sql_id = 'ddqk0yd13pa73'
3 ;
LOADS INVALIDATIONS EXECUTIONS VERSION_COUNT
---------- ------------- ---------- -------------
2 1 1 1
看到INVALIDATIONS 的次數為1, 就是因為剛才的那次GRANT操作。
如果在高峰期,執行許可權的回收或者賦予,那會發生什麼事情?聯合物件的執行計劃無效,全部都要重新生成,那會導致短時間內shared pool會成為瓶頸。效能會下降。
所以不要在系統執行高峰期執行GRANT 或者REVOKE操作。
(備註: 除了授權之外,其他可能會導致執行計劃失效的操作: 收集統計資訊,打補丁,DDL, 索引或者TABLE 在不同的tablespace移動。)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-558220/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 許可權(grant、revoke)Oracle
- Oracle users / 許可權 / grant privOracle
- 授予普通使用者檢視執行計劃許可權
- 擁有GRANT ANY OBJECT PRIVILEGE許可權時的許可權回收Object
- oracle受權與回收許可權grant和revokeOracle
- oracle使用者crontab無許可權使用和不能執行計劃Oracle
- oracle常見受權與回收許可權 grant和revokeOracle
- 記一次 Laravel日誌許可權許可權問題(定時器導致)Laravel定時器
- 多執行緒中自定義執行緒池與shiro導致的許可權錯亂問題解決執行緒
- 系統許可權 GRANT ANY OBJECT PRIVILEGE的作用!Object
- 完美的執行計劃導致的效能問題
- 執行計劃的偏差導致的效能問題
- mysql操作命令梳理(4)-grant授權和revoke回收許可權MySql
- 檔案許可權與計劃任務
- mysql 管理:mysql 執行許可權(轉)MySql
- WebMagic多執行緒導致註解失效問題Web執行緒
- @Transactional 中使用執行緒鎖導致了鎖失效執行緒
- autotrace 和explain plan for可能導致執行計劃錯誤AI
- 執行計劃錯誤導致系統負載高負載
- 使用者有connect,resource,dba角色許可權後回收dba許可權導致無UNLIMITED TABLESPACE許可權造成業務中斷MIT
- 詳解GuassDB資料庫許可權命令:GRANT和REVOKE資料庫
- 普通使用者許可權執行dockerDocker
- 【Oracle】-【AWR/Stackpack】-AWR(Stackpack)執行許可權Oracle
- SYS執行SQL報錯缺少許可權SQL
- RAC oracle 許可權更改導致 實力啟動失敗Oracle
- mysql 給了使用者所有許可權ALL PRIVILEGES,但是該使用者沒有grant許可權MySql
- 統計資訊不準確導致執行計劃走了笛卡爾積
- 統計資訊不正確導致執行計劃的錯誤選擇
- 【MySql】許可權不足導致的無法連線到資料庫以及許可權的授予和撤銷MySql資料庫
- 最近對就有系統人員許可權升級計劃――也談人員許可權的設計。
- 11G的SORT GROUP BY NOSORT導致錯誤執行計劃
- Linux檔案讀、寫、執行許可權Linux
- Android 6.0 執行時許可權詳解Android
- 執行dbms_stats需要什麼許可權
- Android許可權管理之Android 6.0執行時許可權及解決辦法Android
- 【許可權】儲存過程執行時,報ORA-01031許可權不足儲存過程
- 儲存裝置許可權不對導致crs啟動出錯
- Android許可權檢查API checkSelfPermission失效問題AndroidAPI