作者:admin 日期:2023-10-14 瀏覽: 次
詳解Oracle數據庫sql查詢視圖
oracle數據庫關于SQL查詢相關的幾個視圖有v$sql,v$sqlarea,v$sqltext,那這中間有什么區別呢?
1)都存儲了sql內容
2) 記錄的都是位于內存中的sql內容
3) 因為是內存,所以都不保留歷史記錄
1、存儲的位置不同
其中v$sql和v$sqlarea存儲的sql都是位于shared sql area中的sql,而v$sqltext是位于sga中的sql。但文檔沒有明確說明這里的sga是否還包含了psa(私有sql區域--共享服務器模式下)。
2、存儲sql的方式不同
v$sql和v$sqlarea都是用一行來存儲sql全文,而v$sqltext用一行存儲sql的一行。
3、v$sql不存儲包含group by 的sql語句。
通常這個視圖,在每個查詢執行完成后更新,但對于執行很久的sql,它是每5秒更新一次,這點對于查看sql執行狀態是有意義的。
4、存儲的明細不同
V$SQL在子游標級別上列出了在共享sql區域的統計信息,他將原始sql文本展現為一行。V$SQL中的視圖信息一般在sql執行的最后進行更新。然而,對于長時間執行的sql,每5秒會更新一次v$sql視圖。這使得很容易查看長時間執行的sql在運行過程中帶來的影響。
v$sql列說明,如沒有特別說明,均指子游標,存儲的是具體的SQL 和執行計劃相關信息,實際上,v$sqlarea 可以看做 v$sql 根據 sqltext 等 做了 group by 之后的信息
鹽城數據恢復通過以下語句查一下這些視圖的定義,可以看出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$SQLAREA';
SELECT view_definition FROM v$fixed_view_definition WHERE view_name='GV$SQLTEXT';
1、 v$sql
SQL_TEXT //當前正在執行的游標的sql文本的前1000個字符
SQL_FULLTEXT //CLOB類型 整個sql文本,不用借助于V$SQL_TEXT視圖來查看整個文本
SQL_ID //庫緩存中的SQL父游標的標志
SHARABLE_MEM //子游標使用的共享內存的大小,bytes
PERSISTENT_MEM //子游標生存時間中使用的固定內存的總量,bytes
RUNTIME_MEM //在子游標執行過程中需要的固定內存大小,bytes
SORTS //子游標發生的排序數量
LOADED_VERSIONS // 顯示上下文堆是否載入,1是,0否
USERS_OPENING // 執行這個sql的用戶數
FETCHES // sql取數據的次數
EXECUTIONS //自從被載入共享池后,sql執行的次數
FIRST_LOAD_TIME // 父游標產生的時間戳
PARSE_CALLS //解析調用的次數
DISK_CALLS //讀磁盤的次數
DIRECT_WRITES //直接寫的次數
BUFFER_GETS //直接從buffer中得到數據的次數
APPLICATION_WAIT_TIME // 應用等待時間,毫秒
CONCURRENCY_WAIT_TIME //并發等待時間,毫秒
USER_IO_WAIT_TIME //用戶IO等待時間
ROWS_PROCESSED SQL //解析sql返回的總行數
OPTIMIZER_MODE //優化器模式
OPTIMIZER_COST //優化器對于sql給出的成本
PARSING_USER_ID //第一個創建這個子游標的用戶id
HASH_VALUES //解析產生的哈希值
CHILD_NUMBER //該子游標的數量
SERVICE //服務名
CPU_TIME //該子游標解析,執行和獲取數據使用的CPU時間,毫秒
ELAPSED_TIME //sql的執行時間,毫秒
INVALIDATIONS //該子游標的無效次數
MODULE //第一次解析該語句時,通過DBMS_APPLICAITON_INFO.SET_ACTION設置的模塊名
ACTION //第一次解析該語句時,通過DBMS_APPLICAITON_INFO.SET_ACTION設置的動作名
IS_OBSOLETE //標記該子游標過期與否,當子游標過大時會發生這種情況
is_bind_sensitive //不僅指出是否使用綁定變量窺測來生成執行計劃,而且指出這個執行計劃是否依賴于窺測到的值。如果是,這個字段會被設置為Y,否則會被設置為N。
is_bind_aware //表明游標是否使用了擴展的游標共享。如果是,這個字段會被設置為Y,如果不是,這個字段會被設置為N。如果是設置為N,這個游標將被廢棄,不再可用。
is_shareable //表明游標能否被共享。如果可以,這個字段會被設置為Y,否則,會被設置為N。如果被設置為N,這個游標將被廢棄,不再可用。
2、v$sqlarea
v$sqlarea的字段定義和v$sql基本一致,不同的是V$SQLAREA是在父游標級別上統計的sql信息,v$sql的匯總表,進行了group by hash_value,sql_id的匯總。
3、v$sqltext
無錫數據恢復本視圖包括Shared pool中SQL語句的完整文本,一條SQL語句可能分成多個塊被保存于多個記錄內。注:V$SQLAREA和v$sql中的SQL_TEXT字段只包括頭1000個字符, SQL_FULLTEXT以CLOB方式包含了所有的字符
實際調優中建議使用v$sql, 相對來說比v$sqlarea快,而且還不會產生share pool latch的爭用。因v$sql及v$sqlarea存放著統計信息在調優時使用居多,但其sql是不全的,如果想獲得完整的sql就要用v$sqltext了
后面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~