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

1、V$SQL%知多少?
 
一、select table_name from dict where table_name like 'V$SQL%';
V$SQL
V$SQLAREA
V$SQLAREA_PLAN_HASH
V$SQLSTATS
V$SQLTEXT
V$SQLTEXT_WITH_NEWLINES
V$SQL_BIND_CAPTURE
V$SQL_BIND_DATA
V$SQL_BIND_METADATA
V$SQL_CURSOR
V$SQL_JOIN_FILTER
V$SQL_OPTIMIZER_ENV
V$SQL_PLAN
V$SQL_PLAN_STATISTICS
V$SQL_PLAN_STATISTICS_ALL
V$SQL_REDIRECTION
V$SQL_SHARED_CURSOR
V$SQL_SHARED_MEMORY
V$SQL_WORKAREA
V$SQL_WORKAREA_ACTIVE
V$SQL_WORKAREA_HISTOGRAM
v$sql , v$sqlarea,v$sqltext 區別

通常有人喜歡問v$sql,v$sqlarea,v$sqltext這三個視圖的區別,一般還真很少注意這個(這個很重要麼?),看看就曉得了:

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$SQLAREA';

SELECT view_definition FROM v$fixed_view_definition       WHERE view_name='GV$SQLTEXT';

這裏可以看到每個視圖的定義,可以發現者三個視圖分別基於下面三個表:

x$kglcursor_child

x$kglcursor_child_sqlid

x$kglna


--------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$SQLAREA 列出了共享SQL區(Shared SQL Area)中的SQL統計信息,這些SQL按照SQL文本的不同,每條會記錄一行統計數據。注意這裏所說的是“按照SQL文本”來進行區分,也就是說這個視圖的信息可以看作是根據SQL_TEXT進行的一次彙總統計。
Column Datatype Description
SQL_TEXT VARCHAR2(1000) 當前指針的前1000個字符
VERSION_COUNT NUMBER Cache中這個父指針下存在的子指針的數量
EXECUTIONS NUMBER 總的執行次數,包含所有子指針執行次數的彙總
DISK_READS NUMBER 所有子指針的Disk Reads總和
BUFFER_GETS NUMBER 所有子指針的Buffer Gets總和
OPTIMIZER_MODE VARCHAR2(10) SQL執行的優化器模
HASH_VALUE NUMBER 父指針的Hash Value



 ------v$sql    ---  存儲的是具體的SQL 和執行計劃相關信息,實際上,v$sqlarea 可以看做 v$sql 根據 sqltext 等 做了 group by 之後的信息
Column Datatype Descrption
SQL_TEXT VARCHAR2(1000) 當前SQL指針的前1000個字符(也就是說這裏記錄的SQL是不完整的)
EXECUTIONS NUMBER 執行次數
DISK_READS NUMBER 這個子指針Disk Read的次數
BUFFER_GETS NUMBER 這個子指針的Buffer Gets數量
OPTIMIZER_MODE VARCHAR2(10) SQL執行的優化器模式
OPTIMIZER_COST NUMBER SQL執行成本
HASH_VALUE NUMBER 在Library Cache中父指針的Hash Value值

 


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

v$sql裏面找不到完整的sql的時候,則需要從v$sqlarea中找或者拼v$sqltextsql


另外注意這個
QL> desc v$sql_plan
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ADDRESS                                            RAW(4)
HASH_VALUE                                         NUMBER
CHILD_NUMBER                                       NUMBER   ------------   注意這個和 v$sql 裏面的相同字段
   一個SQL語句可能有多個子遊標(Child Cursor);如果不指定值,會羅列出所有子游標的執行計劃。
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的聚合和累計信息

總結:
1、V$SQL,V$SQLAREA 源都是一個
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_text是不全的,如果想獲得完整的sql就要用v$sqltext了,可以。


示例:
1.查看消耗資源最多的SQL:
SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls
FROM V$SQLAREA
WHERE buffer_gets > 10000000 OR disk_reads > 1000000
ORDER BY buffer_gets + 100 * disk_reads DESC;

2.查看某條SQL語句的資源消耗:
SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls
FROM V$SQLAREA
WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');
 

示例:已知hash_value:3111103299,查詢sql語句:
select * from v$sqltext
where hash_value='3111103299'
order by piece 

轉載:http://www.cnblogs.com/sopost/archive/2012/06/03/2532826.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章