Oracle9i中v$sql、v$sqlarea、v$sqltext、v$sql_plan的聯絡與區別

達芬奇的夢發表於2018-05-14
對於同一個SQL語句,如果在不同環境下使用了不同的最佳化器目標的情況下,會有不同的執行計劃,
這樣就要求分別有一個獨立的遊標(即子游標)來區別出每一種情況下的不同的執行行為。[@more@]

Oracle用v$sqlarea中一行儲存同樣語句的SQL,並用欄位version_count的值來指出子游標的個
數,而在v$sql裡面為每個子游標保留了一個單獨的行。兩個表可以透過欄位address和hash_value
相互對應。例如下面例子:

SQL> select address,hash_value,sql_text,version_count
  2  from v$sqlarea where sql_text like 'select value$ from sys.props%';

ADDRESS  HASH_VALUE SQL_TEXT                                       VERSION_COUNT
-------- ---------- ---------------------------------------------- -------------
97F1C9C4  563046721 select value$ from sys.props$ where name = :1   3

SQL> select address,hash_value,child_address,child_number,sql_text
  2  from v$sql where sql_text like 'select value$ from sys.props%';

ADDRESS  HASH_VALUE CHILD_ADDRESS CHILD_NUMBER SQL_TEXT
-------- ---------- ------------- ------------ ----------------------------------------------
97F1C9C4  563046721 97F1C448                 0 select value$ from sys.props$ where name = :1
97F1C9C4  563046721 97EAD3B0                 1 select value$ from sys.props$ where name = :1
97F1C9C4  563046721 97E7EEF0                 2 select value$ from sys.props$ where name = :1

如果想找出這個SQL語句的執行計劃,也可以透過欄位address、hash_value和child_number到v$sql_plan中查詢,
v$sql_plan中是區分了不同子游標的執行計劃的

SQL> select address,child_number,lpad('',2*level)||operation||decode(id,0,' cost='||position) op,
  2         options,object_name
  3    from v$sql_plan t where address='97F1C9C4' and hash_value=563046721;

ADDRESS  CHILD_NUMBER OP                        OPTIONS     OBJECT_NAME 
-------- ------------ ------------------------- ----------- -------------
97F1C9C4            2 SELECT STATEMENT cost=0              
97F1C9C4            2 TABLE ACCESS              FULL        PROPS$
97F1C9C4            1 SELECT STATEMENT cost=0              
97F1C9C4            1 TABLE ACCESS              FULL        PROPS$
97F1C9C4            0 SELECT STATEMENT cost=0              
97F1C9C4            0 TABLE ACCESS              FULL        PROPS$

檢視v$sqltext中沒有SQL語句的相關統計資訊,但是v$sqltext用多行來儲存sql語句,而v$sqlarea中只能
儲存sql語句的前1000個位元組,所以如果sql語句大於1000個位元組,就要到v$sqltext中檢視完整的語句,其字
段PIECE表示每個sql的行順序。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31444259/viewspace-2154437/,如需轉載,請註明出處,否則將追究法律責任。

相關文章