v$sql和v$sqlarea的區別
v$sql:
共享池庫快取中在子指標級別上的SQL統計資訊,包含了所有使用者執行過的所有SQL資訊。不同使用者、不同會話執行相同的SQL的語義、執行計劃可能會不同,這些SQL的字面值相同,即具有相同的sql_id,透過不同的子指標編號child_number來區分。
v$sqlarea:
共享池庫快取中在父指標級別上的SQL統計資訊。對於相同字面值的SQL語句僅以一行顯示,忽略了相同SQL語句在執行會話、語義、執行計劃上的不同,而版本計數version_count則反映了子指標的數量。
在Oracle 10g以前,v$sql和v$sqlarea的定義都是來自於同一張底層表x$kglcursor,而該表的定義又來自於另一張底層表x$kglob,v$sqlarea是在x$kglcursor表上對SQL字面值進行group by後的聚合。而從Oracle 10g開始,這兩個檢視來自於兩個不同的底層表,v$sql(gv$sql)來自於x$kglcursor_child,而v$sqlarea(gv$sqlarea)則來自於x$kglcursor_child_sqlid,v$sqlarea也不再包含group by子句,這使得以前版本中查詢v$sqlarea的效能問題得以緩解。並且,對於未執行的或者buffer_gets為0的SQL指標,從Oracle 10g開始在v$sql中被過濾掉不再列出。
以下用一個簡單實驗闡述其區別。
在使用者cmes中建立一張和scott使用者同樣的表emp
conn cmes/cmes
create table emp as select * from scott.emp;
重啟資料庫,清理一下共享池中的資訊
conn / as sysdba
startup force
cmes使用者執行一個查詢,透過autotrace觀察一下執行計劃和統計資訊
conn cmes/cmes
set autot on
select * from emp;
執行計劃
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 1218 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- 'PLAN_TABLE' is old version
- dynamic sampling used for this statement (level=2)
統計資訊
----------------------------------------------------------
60 recursive calls
0 db block gets
49 consistent gets
3 physical reads
0 redo size
1631 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
4 sorts (memory)
0 sorts (disk)
14 rows processed
這個查詢統計顯示,執行了3個磁碟物理讀,49個記憶體一致性讀。
查一下v$sql中記錄的資訊
col sql_text for a30
select sql_text, executions, optimizer_mode, optimizer_cost, disk_reads, buffer_gets, child_number, sql_id, address, hash_value from v$sql where sql_text='select * from emp';
SQL_TEXT EXECUTIONS OPTIMIZER_ OPTIMIZER_COST DISK_READS BUFFER_GETS CHILD_NUMBER SQL_ID ADDRESS HASH_VALUE
------------------------------ ---------- ---------- -------------- ---------- ----------- ------------ ------------- ---------------- ----------
select * from emp 1 ALL_ROWS 3 3 49 0 a2dk8bdn0ujx7 000007FF05FE38B0 1745700775
記錄的資訊和autotrace顯示的資訊完全一致,child_number是子指標的編號。
再執行一次這個查詢
select * from emp;
執行計劃
----------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMP | 14 | 1218 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
- 'PLAN_TABLE' is old version
- dynamic sampling used for this statement (level=2)
統計資訊
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1631 bytes sent via SQL*Net to client
519 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
14 rows processed
再查一下v$sql中記錄的資訊
col sql_text for a30
select sql_text, executions, optimizer_mode, optimizer_cost, disk_reads, buffer_gets, child_number, sql_id, address, hash_value from v$sql where sql_text='select * from emp';
SQL_TEXT EXECUTIONS OPTIMIZER_ OPTIMIZER_COST DISK_READS BUFFER_GETS CHILD_NUMBER SQL_ID ADDRESS HASH_VALUE
------------------------------ ---------- ---------- -------------- ---------- ----------- ------------ ------------- ---------------- ----------
select * from emp 2 ALL_ROWS 3 3 53 0 a2dk8bdn0ujx7 000007FF05FE38B0 1745700775
執行次數變為2次,磁碟物理讀未增加,因為資料已經在buffer中。記憶體讀繼續增加,和autotrace統計的情況一致。
看一下此時v$sqlarea中記錄的資訊
col sql_text for a30
select sql_text, executions, optimizer_mode, optimizer_cost, disk_reads, buffer_gets, version_count, sql_id, address, hash_value from v$sqlarea where sql_text='select * from emp';
SQL_TEXT EXECUTIONS OPTIMIZER_ OPTIMIZER_COST DISK_READS BUFFER_GETS VERSION_COUNT SQL_ID ADDRESS HASH_VALUE
------------------------------ ---------- ---------- -------------- ---------- ----------- ------------- ------------- ---------------- ----------
select * from emp 2 ALL_ROWS 3 3 53 1 a2dk8bdn0ujx7 000007FF05FE38B0 1745700775
內容與v$sql一致,子指標計數version_count是1,即只有一個版本的相同SQL。
現在用scott使用者執行同樣的查詢
conn scott/tiger
select * from emp;
查詢v$sql中的統計資訊
col sql_text for a30
select sql_text, executions, optimizer_mode, optimizer_cost, disk_reads, buffer_gets, child_number, sql_id, address, hash_value from v$sql where sql_text='select * from emp';
SQL_TEXT EXECUTIONS OPTIMIZER_ OPTIMIZER_COST DISK_READS BUFFER_GETS CHILD_NUMBER SQL_ID ADDRESS HASH_VALUE
------------------------------ ---------- ---------- -------------- ---------- ----------- ------------ ------------- ---------------- ----------
select * from emp 2 ALL_ROWS 3 3 53 0 a2dk8bdn0ujx7 000007FF05FE38B0 1745700775
select * from emp 1 ALL_ROWS 4 13 87 1 a2dk8bdn0ujx7 000007FF05FE38B0 1745700775
現在列出了兩條相同字面值的SQL,子指標編號分別為0和1。
查詢v$sqlarea中的統計資訊
col sql_text for a30
select sql_text, executions, optimizer_mode, optimizer_cost, disk_reads, buffer_gets, version_count, sql_id, address, hash_value from v$sqlarea where sql_text='select * from emp';
SQL_TEXT EXECUTIONS OPTIMIZER_ OPTIMIZER_COST DISK_READS BUFFER_GETS VERSION_COUNT SQL_ID ADDRESS HASH_VALUE
------------------------------ ---------- ---------- -------------- ---------- ----------- ------------- ------------- ---------------- ----------
select * from emp 3 ALL_ROWS 4 16 140 2 a2dk8bdn0ujx7 000007FF05FE38B0 1745700775
可以看到,相同字面值的SQL被合計為一條,版本計數version_count為2,即存在兩個子指標。而執行次數、磁碟物理讀次數、記憶體讀次數便是它們的合計值,這就是v$sqlarea的聚合作用。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28974745/viewspace-2137954/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- V$SQL 和V$SQLAREA區別SQL
- v$sql,v$sqlarea,v$sqltext區別SQL
- v$sqlarea,v$sql,v$sqltext的區別和聯絡SQL
- V$sql_text v$sqlarea v$sql 的區別SQL
- v$sqlarea,v$sql,v$sqltext的區別和聯絡(zt)SQL
- v$sqlarea,v$sql,v$sqltext三個檢視的區別SQL
- V$SQL、V$SQLSTATS、V$SQLAREASQL
- Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的聯絡與區別OracleSQL
- [ZT]v$sqlarea,v$sql,v$sqltext這三個檢視提供的sql語句有什麼區別SQL
- v$sql檢視和v$sqlarea檢視的構建SQL
- v$sql v$sqlarea v$sql_shared_cursor及遊標SQL
- V$SQLAREASQL
- v$sql v$sqlarea和父遊標 子游標記載01SQL
- V$SQLAREA 檢視TOP_SQLSQL
- sql執行計劃_v$sqlarea_v$sql_v$sql_shared_cursorSQL
- V$SQLAREA的用法SQL
- 檢視 v$sql,v$sqlarea,$sqltext,v$sqltext_with_newlines 的差異SQL
- cursor_sharing與v$sqlarea_v$sql_v$sql_shared_cursorSQL
- v$sql v$sqlarea v$sql_shared_cursor及父遊標,子游標SQL
- V$SQLAREA解析SQL
- v$sysstat和v$sesstat區別
- v-if和v-show的區別
- v$sqlarea_parent cursor_v$sql_child cursor關係SQL
- v$metric和v$metric_history的區別
- oracle11g v$sql_v$sqlarea_version_count測試OracleSQL
- 授權某使用者,檢視動態效能檢視的許可權(如v$latch,v$lock,v$sqlarea,v$sql,v$sysstat)SQL
- v-html 、v-text({{}}) 、v-model的區別HTML
- v$lockv和$locked_object的區別Object
- v-if和v-show區別+元件通訊問題元件
- dba_data_files和v$datafile的區別
- (轉):學習Oracle動態效能表-(7)-V$SQLTEXT,V$SQLAREAOracleSQL
- Oracle動態效能檢視學習之v$sqltext & v$sqlareaOracleSQL
- [轉]學習Oracle動態效能表-(6)-V$SQLTEXT,V$SQLAREAOracleSQL
- 【SESSION】v$session and v$license 中sessions_current 的區別Session
- 手機充電器5V2A和5V1A的區別,5V2A和5V1A充電器可以通用嗎?
- android之support-v4、v7、v13的區別Android
- 【Oracle九大效能檢視】之2.v$sqlarea_查效能SQLOracleSQL
- v$sqlarea之parse_calls及loadsSQL