學習動態性能表sql
第三篇-(1)-v$sq 2007.5.25數據庫
V$SQL中存儲具體的SQL語句。緩存
一條語句能夠映射多個cursor,由於對象所指的cursor能夠有不一樣用戶(如例1)。若是有多個cursor(子游標)存在,在V$SQLAREA爲全部cursor提供集合信息。服務器
例1:session
這裏介紹如下child cursor架構
user A: select * from tbloracle
user B: select * from tbloop
你們認爲這兩條語句是否是同樣的啊,可能會有不少人會說是同樣的,但我告訴你不必定,那爲何呢?性能
這個tblA看起來是同樣的,可是不必定哦,一個是A用戶的, 一個是B用戶的,這時他們的執行計劃分析代碼差異可能就大了哦,改下寫法你們就明白了:學習
select * from A.tbl
select * from B.tbl
在個別cursor上,v$sql可被使用。該視圖包含cursor級別資料。當試圖定位session或用戶以分析cursor時被使用。
PLAN_HASH_VALUE列存儲的是數值表示的cursor執行計劃。可被用來對比執行計劃。PLAN_HASH_VALUE讓你沒必要一行一行對比便可輕鬆鑑別兩條執行計劃是否相同。
V$SQL中的列說明:
- SQL_TEXT:SQL文本的前1000個字符
- SHARABLE_MEM:佔用的共享內存大小(單位:byte)
- PERSISTENT_MEM:生命期內的固定內存大小(單位:byte)
- RUNTIME_MEM:執行期內的固定內存大小
- SORTS:完成的排序數
- LOADED_VERSIONS:顯示上下文堆是否載入,1是0否
- OPEN_VERSIONS:顯示子游標是否被鎖,1是0否
- USERS_OPENING:執行語句的用戶數
- FETCHES:SQL語句的fetch數。
- EXECUTIONS:自它被載入緩存庫後的執行次數
- USERS_EXECUTING:執行語句的用戶數
- LOADS:對象被載入過的次數
- FIRST_LOAD_TIME:初次載入時間
- INVALIDATIONS:無效的次數
- PARSE_CALLS:解析調用次數
- DISK_READS:讀磁盤次數
- BUFFER_GETS:讀緩存區次數
- ROWS_PROCESSED:解析SQL語句返回的總列數
- COMMAND_TYPE:命令類型代號
- OPTIMIZER_MODE:SQL語句的優化器模型
- OPTIMIZER_COST:優化器給出的本次查詢成本
- PARSING_USER_ID:第一個解析的用戶ID
- PARSING_SCHEMA_ID:第一個解析的計劃ID
- KEPT_VERSIONS:指出是否當前子游標被使用DBMS_SHARED_POOL包標記爲常駐內存
- ADDRESS:當前遊標父句柄地址
- TYPE_CHK_HEAP:當前堆類型檢查說明
- HASH_VALUE:緩存庫中父語句的Hash值
- PLAN_HASH_VALUE:數值表示的執行計劃。
- CHILD_NUMBER:子游標數量
- MODULE:在第一次解析這條語句是經過調用DBMS_APPLICATION_INFO.SET_MODULE設置的模塊名稱。
- ACTION:在第一次解析這條語句是經過調用DBMS_APPLICATION_INFO.SET_ACTION設置的動做名稱。
- SERIALIZABLE_ABORTS:事務未能序列化次數
- OUTLINE_CATEGORY:若是outline在解釋cursor期間被應用,那麼本列將顯示出outline各種,不然本列爲空
- CPU_TIME:解析/執行/取得等CPU使用時間(單位,毫秒)
- ELAPSED_TIME:解析/執行/取得等消耗時間(單位,毫秒)
- OUTLINE_SID:outline session標識
- CHILD_ADDRESS:子游標地址
- SQLTYPE:指出當前語句使用的SQL語言版本
- REMOTE:指出是否遊標是一個遠程映象(Y/N)
- OBJECT_STATUS:對象狀態(VALID or INVALID)
- IS_OBSOLETE:當子游標的數量太多的時候,指出遊標是否被廢棄(Y/N)
第三篇-(2)-V$SQL_PLAN 2007.5.28
本視圖提供了一種方式檢查那些執行過的而且仍在緩存中的cursor的執行計劃。
一般,本視圖提供的信息與打印出的EXPLAIN PLAN很是類似,不過,EXPLAIN PLAN顯示的是理論上的計劃,並不必定在執行的時候就會被使用,但V$SQL_PLAN中包括的是實際被使用的計劃。獲自EXPLAIN PLAN語句的執行計劃跟具體執行的計劃能夠不一樣,由於cursor可能被不一樣的session參數值編譯(如,HASH_AREA_SIZE)。
V$SQL_PLAN中數據能夠:
- 確認當前的執行計劃
- 鑑別建立表索引效果
- 尋找cursor包括的存取路徑(例如,全表查詢或範圍索引查詢)
- 鑑別索引的選擇是否最優
- 決定是否最優化選擇的詳細執行計劃(如,nested loops join)如開發者所願。
本視圖同時也可被用於當成一種關鍵機制在計劃對比中。計劃對比一般用於下列各項發生改變時:
- 刪除和新建索引
- 在數據庫對象上執行分析語句
- 修改初始參數值
- 從rule-based切換至cost-based優化方式
- 升級應用程序或數據庫到新版本以後
若是以前的計劃仍然在(例如,從V$SQL_PLAN選擇出記錄並保存到oracle表中供參考),那麼就有可能去鑑別一條SQL語句在執行計劃改變後性能方面有什麼變化。
注意:
Oracle公司強烈推薦你使用DBMS_STATS包而非ANALYZE收集優化統計。該包可讓你平行地蒐集統計項,收集分區對象(partitioned objects)的全集統計,而且經過其它方式更好的調整你的統計收集方式。此處,cost-based優化器將最終使用被DBMS_STATS收集的統計項。瀏覽Oracle9i Supplied PL/SQL包和類型參考以得到關於此包的更多信息。
不過,你必須使用ANALYZE語句而非DBMS_STATS進行統計收集,不涉及cost-based優化器,就像:
·使用VALIDATE或LIST CHAINED ROWS子句
·在freelist blocks上收集信息。
V$SQL_PLAN中的經常使用列:
除了一些新加列,本視圖幾乎包括全部的PLAN_TABLE列,那些一樣存在於PLAN_TABLE中的列擁有相同的值:
- ADDRESS:當前cursor父句柄位置
- HASH_VALUE:在library cache中父語句的HASH值。ADDRESS和HASH_VALUE這兩列能夠被用於鏈接v$sqlarea查詢 cursor-specific 信息。
- CHILD_NUMBER:使用這個執行計劃的子cursor數列ADDRESS,HASH_VALUE以及CHILD_NUMBER可被用於鏈接v$sql查詢子cursor信息。
- OPERATION: 在各步驟執行內部操做的名稱,例如:TABLE ACCESS
- OPTIONS: 描述列OPERATION在操做上的變種,例如:FULL
- OBJECT_NODE: 用於訪問對象的數據庫連接database link 的名稱對於使用並行執行的本地查詢該列可以描述操做中輸出的次序。
- OBJECT#: 表或索引對象數量
- OBJECT_OWNER: 對於包含有表或索引的架構schema 給出其全部者的名稱
- OBJECT_NAME: 表或索引名
- OPTIMIZER: 執行計劃中首列的默認優化模式;例如,CHOOSE。好比業務是個存儲數據庫,它將告知是否對象是最優化的。
- ID: 在執行計劃中分派到每一步的序號。
- PARENT_ID: 對ID 步驟的輸出進行操做的下一個執行步驟的ID。
- DEPTH: 業務樹深度(或級)。
- POSITION: 對於具備相同PARENT_ID 的操做其相應的處理次序。
- COST: cost-based方式優化的操做開銷的評估,若是語句使用rule-based方式,本列將爲空。
- CARDINALITY: 根據cost-based方式操做所訪問的行數的評估。
- BYTES: 根據cost-based方式操做產生的字節的評估,。
- OTHER_TAG: 其它列的內容說明。
- PARTITION_START: 範圍存取分區中的開始分區。
- PARTITION_STOP: 範圍存取分區中的中止分區。
- PARTITION_ID: 計算PARTITION_START和PARTITION_STOP這對列值的步數
- OTHER: 其它信息即執行步驟細節,供用戶參考。
- DISTRIBUTION: 爲了並行查詢,存儲用於從生產服務器到消費服務器分配列的方法
- CPU_COST: 根據cost-based方式CPU操做開銷的評估。若是語句使用rule-based方式,本列爲空。
- IO_COST: 根據cost-based方式I/O操做開銷的評估。若是語句使用rule-based方式,本列爲空。
- TEMP_SPACE: cost-based方式操做(sort or hash-join)的臨時空間佔用評估。若是語句使用rule-based方式,本列爲空。
- ACCESS_PREDICATES: 指明以便在存取結構中定位列,例如,在範圍索引查詢中的開始或者結束位置。
- FILTER_PREDICATES: 在生成數據以前即指明過濾列。
CONNECT BY操做產生DEPTH列替換LEVEL僞列,有時被用於在SQL腳本中幫助indent PLAN_TABLE數據
V$SQL_PLAN中的鏈接列
列ADDRESS,HASH_VALUE和CHILD_NUMBER被用於鏈接V$SQL或V$SQLAREA來獲取cursor-specific信息,例如,BUFFER_GET,或鏈接V$SQLTEXT獲取完整的SQL語句。
Column View Joined Column(s)
ADDRESS, HASH_VALUE V$SQLAREA ADDRESS, HASH_VALUE
ADDRESS,HASH_VALUE,CHILD_NUMBER V$SQ ADDRESS,HASH_VALUE,CHILD_NUMBER
ADDRESS, HASH_VALUE V$SQLTEXT ADDRESS, HASH_VALUE
確認SQL語句的優化計劃
下列語句顯示一條指定SQL語句的執行計劃。查看一條SQL語句的執行計劃是調整優化SQL語句的第一步。這條被查詢到執行計劃的SQL語句是經過語句的HASH_VALUE和ADDRESS列識別。分兩步執行:
1.SELECT sql_text, address, hash_value FROM v$sql
WHERE sql_text like '%TAG%';
SQL_TEXT ADDRESS HASH_VALUE
-------- -------- ----------
82157784 1224822469
2.SELECT operation, options, object_name, cost FROM v$sql_plan
WHERE address = '82157784' AND hash_value = 1224822469;
OPERATION OPTIONS OBJECT_NAME COST
-------------------- ------------- ------------------ ----
SELECT STATEMENT 5
SORT
AGGREGATE
HASH JOIN 5
TABLE ACCESS FUL DEPARTMENTS 2
TABLE ACCESS FUL EMPLOYEES 2