v$sql,v$sqlarea,v$sqltext區別

v$sqltext
存儲的是完整的SQL,SQL被分割

SQL> desc v$sqltext
Name Null? Type
----------------------------------------- -------- ----------------------------
ADDRESS RAW(4) ---------
HASH_VALUE NUMBER --------- 和 address 一起唯一標誌一條sql
COMMAND_TYPE NUMBER
PIECE NUMBER ---------- 分片之後的順序編號
SQL_TEXT VARCHAR2(64) -------------- 注意長度


v$sqlarea --------- 存儲的SQL 和一些相關的信息,比如累計的執行次數,邏輯讀,物理讀等統計信息
SQL> desc v$sqlarea
Name Null? Type
----------------------------------------- -------- ----------------------------
SQL_TEXT VARCHAR2(1000)
SHARABLE_MEM NUMBER
PERSISTENT_MEM NUMBER
RUNTIME_MEM NUMBER
SORTS NUMBER
VERSION_COUNT NUMBER
LOADED_VERSIONS NUMBER
OPEN_VERSIONS NUMBER
USERS_OPENING NUMBER
FETCHES NUMBER
EXECUTIONS NUMBER
USERS_EXECUTING NUMBER
LOADS NUMBER
FIRST_LOAD_TIME VARCHAR2(38)
INVALIDATIONS NUMBER
PARSE_CALLS NUMBER
DISK_READS NUMBER
BUFFER_GETS NUMBER
ROWS_PROCESSED NUMBER
COMMAND_TYPE NUMBER
OPTIMIZER_MODE VARCHAR2(25)
PARSING_USER_ID NUMBER
PARSING_SCHEMA_ID NUMBER
KEPT_VERSIONS NUMBER
ADDRESS RAW(4)
HASH_VALUE NUMBER
MODULE VARCHAR2(64)
MODULE_HASH NUMBER
ACTION VARCHAR2(64)
ACTION_HASH NUMBER
SERIALIZABLE_ABORTS NUMBER
CPU_TIME NUMBER
ELAPSED_TIME NUMBER
IS_OBSOLETE VARCHAR2(1)
CHILD_LATCH NUMBER


v$sql ---------- 存儲的是具體的SQL 和執行計劃相關信息,實際上,v$sqlarea 可以看做 v$sql 根據 sqltext 等 做了 group by 之後的信息


SQL> desc v$sql
Name Null? Type
----------------------------------------- -------- ----------------------------
SQL_TEXT VARCHAR2(1000)
SHARABLE_MEM NUMBER
PERSISTENT_MEM NUMBER
RUNTIME_MEM NUMBER
SORTS NUMBER
LOADED_VERSIONS NUMBER
OPEN_VERSIONS NUMBER
USERS_OPENING NUMBER
FETCHES NUMBER
EXECUTIONS NUMBER
USERS_EXECUTING NUMBER
LOADS NUMBER
FIRST_LOAD_TIME VARCHAR2(38)
INVALIDATIONS NUMBER
PARSE_CALLS NUMBER
DISK_READS NUMBER
BUFFER_GETS NUMBER
ROWS_PROCESSED NUMBER
COMMAND_TYPE NUMBER
OPTIMIZER_MODE VARCHAR2(10)
OPTIMIZER_COST NUMBER
PARSING_USER_ID NUMBER
PARSING_SCHEMA_ID NUMBER
KEPT_VERSIONS NUMBER
ADDRESS RAW(4)
TYPE_CHK_HEAP RAW(4)
HASH_VALUE NUMBER
PLAN_HASH_VALUE NUMBER
CHILD_NUMBER NUMBER ---------- 注意這個
MODULE VARCHAR2(64)
MODULE_HASH NUMBER
ACTION VARCHAR2(64)
ACTION_HASH NUMBER
SERIALIZABLE_ABORTS NUMBER
OUTLINE_CATEGORY VARCHAR2(64)
CPU_TIME NUMBER
ELAPSED_TIME NUMBER
OUTLINE_SID NUMBER -------------- 注意這裏跟 outline 有關
CHILD_ADDRESS RAW(4)
SQLTYPE NUMBER
REMOTE VARCHAR2(1)
OBJECT_STATUS VARCHAR2(19)
LITERAL_HASH_VALUE NUMBER
LAST_LOAD_TIME VARCHAR2(38)
IS_OBSOLETE VARCHAR2(1)
CHILD_LATCH NUMBER

補充:
1、查一下這些視圖的定義你就能理解,它們的源都是一個。
SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQL';
SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQL_AREA';

2、實際上最模糊的是v$sql與v$sqlarea,區別與聯繫還有:

a、v$sql_area相當於是按INST_ID, KGLNAOBJ, KGLHDPAR, KGLNAHSH, KGLNATIM, GLOBTS0,GLOBT19, KGLOBTS1, KGLOBT20,DECODE(KGLOBT33, 1, 'Y', 'N'),KGLHDCLT這些列的自v$sql的group by,也就是說v$sql的每一行表示的是每一個sql語句的一個versiion,而v$sqlarea存放的是相同語句不同version一個彙總。

b、 v$sql與v$sqlarea的源都是一個:X$KGLCURSOR

c、實際調優中建議使用v$sql,相對來說比v$sqlarea快,而且還不會產生share pool latch的爭用。

3、因v$sql及v$sqlarea存放着統計信息在調優時使用居多,但其sql是不全的,如果想獲得完整的sql就要用v$sqltext了。


另外注意這個
QL> desc v$sql_plan
Name Null? Type
----------------------------------------- -------- ----------------------------
ADDRESS RAW(4)
HASH_VALUE NUMBER
CHILD_NUMBER NUMBER ------------ 注意這個和 v$sql 裏面的相同字段
OPERATION VARCHAR2(60)
OPTIONS VARCHAR2(60)
OBJECT_NODE VARCHAR2(20)
OBJECT# NUMBER
OBJECT_OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(64)
OPTIMIZER VARCHAR2(40)
ID NUMBER
PARENT_ID NUMBER
DEPTH NUMBER
POSITION NUMBER
SEARCH_COLUMNS NUMBER
COST NUMBER
CARDINALITY NUMBER
BYTES NUMBER
OTHER_TAG VARCHAR2(70)
PARTITION_START VARCHAR2(10)
PARTITION_STOP VARCHAR2(10)
PARTITION_ID NUMBER
OTHER VARCHAR2(4000)
DISTRIBUTION VARCHAR2(40)
CPU_COST NUMBER
IO_COST NUMBER
TEMP_SPACE NUMBER
ACCESS_PREDICATES VARCHAR2(4000)
FILTER_PREDICATES VARCHAR2(4000)


實際上,看起來同樣的一句SQL ,往往具有不同的執行計劃
如果是不同的數據庫用戶,那麼相應的涉及的 對象可能都不一樣,注意v$sql 中
OBJECT# NUMBER
OBJECT_OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(64)
OPTIMIZER VARCHAR2(40)

即使是相同的數據庫用戶,若 session 的優化模式、session 級的參數等不一樣,執行計劃也能不同。所以即使相同的sql,也可能具有不同的執行計劃!

v$sql join to v$sql_plan 就代表了具體的sql的執行計劃,通過下面3個字段做連接

ADDRESS RAW(4)
HASH_VALUE NUMBER
CHILD_NUMBER NUMBER


而v$SQLAREA 忽略了 執行計劃等差異,只是在形式上sql文本看起來一樣!相當於做了個聚合,是多個不同執行計劃的sql的聚合和累計信息


Oracle服務器爲當前在共享池library cache中的sql語句提供了三種查詢執行統計信息的動態視圖。他們是v$sql,v$sqlarea和v$sqlxs。

V$sql針對不同version的sql語句提供一條記錄。這就意味着每個child cursor擁有自己的執行統計數據。

V$sqlarea針對不同sql語句提供一條記錄。比如:不同的parent cursor。這就意味這個統計信息是所有child cursor之和。他不是依賴於v$sql。

V$sqlxs是v$sqlarea的簡單版本。主要用來statspack產生sql報告部分。他是對v$sql的group by查詢。在oracle_home/rdbms/admin/catsnmp.sql中定義。

V$sqlarea或者v$sqlxs可以用來確定按特定分類的幾個top sql語句。一旦被確定,v$sql可以用來深入查看該語句不同version的統計信息。

V$sql需要更少資源比起v$sqlarea,因爲他避免了group by操作,並且會產生更少的library cache latch競爭。

SELECT * FROM

(SELECT hash_value,address,substr(sql_text,1,40) sql,

[list of columns], [list of derived values]

FROM [V$SQL or V$SQLXS or V$SQLAREA]

WHERE [list of threshold conditions for columns]

ORDER BY [list of ordering columns] DESC)

WHERE rownum <= [number of top SQL statements];

這是一個通用的模板。

下面來看一個實際的例子:

SELECT * FROM

(SELECT hash_value,address,substr(sql_text,1,40) sql,

buffer_gets, executions, buffer_gets/executions "Gets/Exec"

FROM V$SQLAREA

WHERE buffer_gets > 100000 AND executions > 10

ORDER BY buffer_gets DESC)

WHERE rownum <= 10;



其中:

[list of columns] = buffer_gets, executions

[list of derived values] = buffer_gets/executions

[list of threshold conditions for columns] = buffer_gets > 100000, executions > 10

[list of ordering columns] = buffer_gets

[number of top SQL statements] = 10
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章