[20120425]PLAN_HASH_VALUE與 V$SQLAREA.txt
V$SQLAREA相當於V$SQL的聚集,而各個子游標的執行計劃的PLAN_HASH_VALUE可能不同,而v$sqlarea如何記錄的呢?
測試環境:
2.測試指令碼:
--執行指令碼
3.執行結果如下:
--可以發現V$SQLAREA中PLAN_HASH_VALUE並沒有變化:
4.每次執行完成後休息一定的秒數:
--sleep 1秒
SQL> @b3.sql 1
--可以發現V$SQLAREA中PLAN_HASH_VALUE最後一次發生了變化:
--僅僅在中間插入一行exec dbms_lock.sleep(1);看來理論講多數情況下V$SQLAREA中記錄的PLAN_HASH_VALUE是最後執行一次的計劃hash值。
5.註解指令碼重新整理共享池的語句在執行:
@b3.sql 1
--可以發現V$SQLAREA中PLAN_HASH_VALUE每次都發生變化。
總結:
oracle內部的一些機制不是很清楚,不過多數情況下V$SQLAREA中記錄的PLAN_HASH_VALUE是最後執行一次的計劃hash值。
如果是不同的使用者訪問自己的表情況如何呢?估計應該也是一樣。
1.建立使用者:
--可以發現PLAN_HASH_VALUE發生了變化,並且PARSING_SCHEMA_NAME也跟者變化。
--不過這樣在toad中SGA trace下看執行計劃有可能看錯!
測試環境:
select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
2.測試指令碼:
drop table t purge ;
create table t as select rownum id,'test' name from dual connect by level<=999;
insert into t select 1000,'test' from dual connect by level<=1001;
commit ;
create index i_t_id on t(id);
exec dbms_stats.gather_table_stats(ownname=>user,tabname=>'t',cascade=>true,estimate_percent=>100,method_opt=>'for columns id size 254')
--執行指令碼
spool aa.txt
alter system flush shared_pool;
variable a NUMBER
exec :a :=41;
select /*+ bind_aware */ * from t where id = :a;
col sql_id new_value sql_id
select sql_id, address from v$sqlarea where sql_text = 'select /*+ bind_aware */ * from t where id = :a';
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
exec :a :=1000;
select /*+ bind_aware */ * from t where id = :a;
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
exec :a :=41;
select /*+ bind_aware */ * from t where id = :a;
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
exec :a :=1000;
select /*+ bind_aware */ * from t where id = :a;
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
3.執行結果如下:
$ grep -A 2 PLAN_HASH_VALUE aa.txt
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
4153437776
--可以發現V$SQLAREA中PLAN_HASH_VALUE並沒有變化:
4.每次執行完成後休息一定的秒數:
spool aa.txt
alter system flush shared_pool;
variable a NUMBER
exec :a :=41;
select /*+ bind_aware */ * from t where id = :a;
exec dbms_lock.sleep(&1);
col sql_id new_value sql_id
select sql_id, address from v$sqlarea where sql_text = 'select /*+ bind_aware */ * from t where id = :a';
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
exec :a :=1000;
select /*+ bind_aware */ * from t where id = :a;
exec dbms_lock.sleep(&1);
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
exec :a :=41;
select /*+ bind_aware */ * from t where id = :a;
exec dbms_lock.sleep(&1);
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
exec :a :=1000;
select /*+ bind_aware */ * from t where id = :a;
exec dbms_lock.sleep(&1);
select plan_hash_value from v$sqlarea where sql_id='&&sql_id';
--sleep 1秒
SQL> @b3.sql 1
$ grep -A 2 PLAN_HASH_VALUE aa.txt
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
1601196873
--可以發現V$SQLAREA中PLAN_HASH_VALUE最後一次發生了變化:
--僅僅在中間插入一行exec dbms_lock.sleep(1);看來理論講多數情況下V$SQLAREA中記錄的PLAN_HASH_VALUE是最後執行一次的計劃hash值。
5.註解指令碼重新整理共享池的語句在執行:
@b3.sql 1
$ grep -A 2 PLAN_HASH_VALUE aa.txt
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
1601196873
--
PLAN_HASH_VALUE
---------------
4153437776
--
PLAN_HASH_VALUE
---------------
1601196873
--可以發現V$SQLAREA中PLAN_HASH_VALUE每次都發生變化。
總結:
oracle內部的一些機制不是很清楚,不過多數情況下V$SQLAREA中記錄的PLAN_HASH_VALUE是最後執行一次的計劃hash值。
如果是不同的使用者訪問自己的表情況如何呢?估計應該也是一樣。
1.建立使用者:
CREATE USER TEST IDENTIFIED BY test123
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- 2 System Privileges for TEST
GRANT CREATE TABLE TO TEST;
GRANT CREATE SESSION TO TEST;
ALTER USER TEST QUOTA UNLIMITED ON USERS;
create table test.emp as select * from scott.emp ;
2.在scott使用者下執行:
SQL> variable a number ;
SQL> exec :a := 7369;
PL/SQL procedure successfully completed.
SQL> select * from emp where empno=:a;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
SQL> col sql_id new_value sql_id
SQL> select sql_id, address from v$sqlarea where sql_text = 'select * from emp where empno=:a';
SQL_ID ADDRESS
------------- ----------------
0m472wx7184s6 00000000995373D0
SQL> SELECT parsing_schema_id, parsing_schema_name, parsing_user_id, plan_hash_value FROM v$sqlarea WHERE sql_id = '&&sql_id';
old 1: SELECT parsing_schema_id, parsing_schema_name, parsing_user_id, plan_hash_value FROM v$sqlarea WHERE sql_id = '&&sql_id'
new 1: SELECT parsing_schema_id, parsing_schema_name, parsing_user_id, plan_hash_value FROM v$sqlarea WHERE sql_id = '0m472wx7184s6'
PARSING_SCHEMA_ID PARSING_SCHEMA_NAME PARSING_USER_ID PLAN_HASH_VALUE
----------------- ------------------------------ --------------- ---------------
84 SCOTT 84 2949544139
3.在test使用者下執行,由於我沒有建立索引,執行計劃會不同。
SQL> variable a number ;
SQL> exec :a := 7369;
PL/SQL procedure successfully completed.
SQL> select * from emp where empno=:a;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
--回到scott使用者查詢:
SQL> SELECT parsing_schema_id, parsing_schema_name, parsing_user_id, plan_hash_value FROM v$sqlarea WHERE sql_id = '&&sql_id';
old 1: SELECT parsing_schema_id, parsing_schema_name, parsing_user_id, plan_hash_value FROM v$sqlarea WHERE sql_id = '&&sql_id'
new 1: SELECT parsing_schema_id, parsing_schema_name, parsing_user_id, plan_hash_value FROM v$sqlarea WHERE sql_id = '0m472wx7184s6'
PARSING_SCHEMA_ID PARSING_SCHEMA_NAME PARSING_USER_ID PLAN_HASH_VALUE
----------------- ------------------------------ --------------- ---------------
96 TEST 96 3956160932
--可以發現PLAN_HASH_VALUE發生了變化,並且PARSING_SCHEMA_NAME也跟者變化。
--不過這樣在toad中SGA trace下看執行計劃有可能看錯!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-722254/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vue 的v-on與v-bindVue
- 【檢視】V$BGPROCESS與V$PROCESS間的區別與聯絡
- v$session之小測試(一)_與v$lockSession
- v$session之小測試(二)_與v$sqlSessionSQL
- 關於v$process與v$session中process的理解Session
- v$datafile.file#與v$tempfile.file#區別
- 動態元件與v-on元件
- cursor_sharing與v$sqlarea_v$sql_v$sql_shared_cursorSQL
- Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的聯絡與區別OracleSQL
- ITCAM for Websphere v6.0與ITM v6.1整合的快速指南Web
- v$session與v$sql連線現在使用哪個欄位?SessionSQL
- V$TEMPSEG_USAGE與Oracle排序Oracle排序
- React v16 與 Webpack v4 的多特性模板專案ReactWeb
- v-if與v-show造成部分元素丟失的問題——v-if複用元素問題
- 淺談Armadillo V.3.75 與 V.3.78的保護【原創】
- vue.js指令與事件(v-bind)Vue.js事件
- fast_start_parallel_rollback與v$fast_start_servers和v$fast_start_transactionsASTParallelServer
- 小偷?MiniCPM-Llama3-V 2.5與Llama3-V剽竊之爭
- v$sqlarea_parse_calls與executions與session_cached_cursors關係SQLSession
- Kafka v2.3 快速入門與實踐Kafka
- vue.js顯示與隱藏(v-if)Vue.js
- V8 記憶體分配與垃圾回收記憶體
- oracle動態檢視v$,v_$,gv$,gv_$與x$之間的關係Oracle
- 榮耀V9 Play和榮耀V9外觀與配置對比評測
- 華為榮耀9與榮耀V9區別對比評測:榮耀9與榮耀V9哪個值得買?
- V$SESSION中的saddr,paddr,taddr 與v$process及v$transaction中欄位的關係Session
- V$SQL、V$SQLSTATS、V$SQLAREASQL
- v$session之小測試(三)_與dba_objectsSessionObject
- 前端【VUE】02-vue指令【v-html 、v-show、 v-if 、v-else、v-on、v-bind、v-for、v-model】前端VueHTML
- v$sql,v$sqlarea,v$sqltext區別SQL
- 萬字長文:ELK(V7)部署與架構分析架構
- V8 的 Error 物件與棧追蹤的妙用Error物件
- NYUD V2資料集的簡介與提取
- Java物件導向系列[v1.0.0][索引與檢視]Java物件索引
- v$sesstat,v$mystat,v$statname和v$sysstat檢視簡介
- vue v-text,v-html,v-once,v-pre,v-cloak的使用VueHTML
- 幾個檢視 v$mystat v$systata v$sessionSession
- Go 語法速覽與實踐清單(V0.5)Go