查看死鎖
SELECT
s.sid "會話ID",
s.lockwait "等待鎖",
s.event "等待的資源/事件", -- 最近等待或正在等待的資源/事件
DECODE(lo.locked_mode, 0, '尚未獲得鎖', 1, NULL, 2, '行共享鎖', 3, '行排它鎖', 4, '共享表鎖',
5,'共享行排它鎖',6, '排它表鎖') "鎖模式",
do.object_name "被鎖物件",
s.status "會話狀態",
sq.SQL_TEXT,
sq.SQL_FULLTEXT,
sq.executions "SQL執行次數",
ROUND(sq.elapsed_time/1000000, 2) "SQL執行時間(秒)",
DECODE(sq.executions,0,'-',NULL,'-',ROUND(sq.elapsed_time/1000000/sq.executions, 2)) "SQL平均執行時間(秒)",
DECODE(sq.executions,0,'-',NULL,'-',ROUND(sq.rows_processed/sq.executions, 2)) "平均回傳行數",
s.sql_exec_start "SQL開始執行時間",
sq.last_active_time "查詢計劃最后活躍時間",
lo.process "作業系統行程ID",
s.port "行程埠號",
s.program "行程名稱",
lo.os_user_name "作業系統用戶名",
s.machine "作業系統機器名稱",
'ALTER SYSTEM KILL SESSSION '''||s.sid||','||s.serial#||''';' "終止會話操作"
FROM v$sql sq
JOIN v$session s on s.sql_hash_value = https://www.cnblogs.com/shouke/p/sq.hash_value
JOIN v$locked_object lo on lo.session_id = s.sid
JOIN dba_objects do on do.object_id = lo.object_id
WHERE s.username='OPT_WMS_USER' ; -- Oracle用戶名稱,大寫
說明:
-
如果
lockwait值不為空(形如0000001F83D6C748),并且status為ACTIVE,則說明存在死鎖 -
event最近等待或正在等待的資源/事件:-
enq: TX - row lock contention:按模式6等待TX:當會話等待另一個會話已持有的行級鎖時發生該事件,即某個用戶正在更新、洗掉另一個會話希望更新、洗掉的行時,會發生這種情況,這種型別的TX排隊等待對應于等待事件enq:TX - row lock contention,解決方案:已經持有鎖的第一個會話執行提交或回
-
查看慢查詢
查詢執行最慢的SQL
SELECT * FROM (
SELECT s.sql_text,
--s.sql_fulltext, 注釋掉該列,可以加快查詢速度(如果需要查詢完整sql文本,可以考慮通過sql_id二次查詢)
s.sql_id,
s.executions "執行次數",
ROUND(s.elapsed_time / 1000000, 2) "總執行時間(秒)",
ROUND(s.elapsed_time / 1000000 / s.executions, 2) "平均執行時間", --單位:秒
s.first_load_time "父游標創建時間",
s.parsing_user_id "用戶id",
u.username "用戶名"
FROM v$sqlarea s
LEFT JOIN all_users u ON s.parsing_user_id = u.user_id
WHERE s.executions > 0
AND u.username = 'OPT_WMS_USER' --注意 用戶名大寫
ORDER BY 平均執行時間 DESC)
WHERE rownum <= 50
說明:為什么不從v$sql統計資訊?這是因為即便相同的SQL,每次執行耗時也可能不一樣,所以,考慮求平均值,所以需要對SQL分組統計,SQL_TEXT相同,大概率為同一條SQL,所以考慮從按SQL_TEXT分組統計的v$sqlarea讀取資訊,當然,出于嚴謹的考慮,也可以不分組統計,把v$sqlarea替換成v$sql就好了,
查詢SQL執行次數,按次數降序排序
SELECT * FROM (
SELECT s.sql_text,
--s.sql_fulltext,
s.sql_id,
s.executions "執行次數",
s.last_active_time "最后執行時間",
s.first_load_time "父游標創建時間",
s.parsing_user_id "執行用戶id",
u.username "執行用戶",
RANK() OVER(ORDER BY executions DESC) executions_rank
FROM v$sql s
LEFT JOIN all_users u
ON u.user_id = s.parsing_user_id) T
WHERE executions_rank <= 100;
注意:之所以從v$sql獲取統計資料,是因為這里未對SQL_TEXT做GROUP BY(SQL_TEXT是完整SQL文本前1000個字符,存在截斷的可能,按在這個統計可能不準確),就針對每條SQL(不管是否相同)單獨統計,當然,也可以考慮按SQL_TEXT分組統計,把v$sql改成v$sqlarea就好了,
查看存在TABLE ACCESS FULL行為的SQL
SELECT s.sql_text, s.sql_fulltext, sp.sql_id
FROM v$sql_plan sp
LEFT JOIN v$sql s on sp.sql_id = s.sql_id
WHERE sp.operation = 'TABLE ACCESS'
AND sp.options = 'FULL'
AND sp.object_owner = 'OPT_WMS_USER_B' --注意 用戶名大寫 --可選查詢條件
V$SQL
V$SQL列出了關于共享SQL區,不含GROUP BY子句的統計,輸入的原始SQL文本的每個子項各占一行,通常在查詢執行結束時更新V$SQL中展示的統計資訊,然而針對長耗時查詢,每5秒更新一次,這樣更容易在運行期間查看長時間運行的SQL陳述句帶來的影響
| Column | Datatype | Description |
|---|---|---|
SQL_TEXT |
VARCHAR2(1000) |
當前游標的SQL文本的前1000個字符 |
SQL_FULLTEXT |
CLOB |
以<CLOB>方式展示的SQL陳述句全文,可使用該列檢索SQL陳述句全文,而無需連接V$SQLTEXT動態性能視圖, |
SQL_ID |
VARCHAR2(13) |
類別庫快取中父游標的SQL標識, |
SHARABLE_MEM |
NUMBER |
子游標使用的共享記憶體量(位元組為單位) |
PERSISTENT_MEM |
NUMBER |
子游標生存周期內使用的固定記憶體量(位元組為單位) |
RUNTIME_MEM |
NUMBER |
子游標運行期間所需的固定記憶體量(位元組為單位) |
SORTS |
NUMBER |
子游標完成的排序次數 |
LOADED_VERSIONS |
NUMBER |
指示是否已加載背景關系堆,1表示已加載,0表示未加載, |
OPEN_VERSIONS |
NUMBER |
指示子游標是否被鎖定,1表示被鎖定,0表示未被鎖定 |
USERS_OPENING |
NUMBER |
任意子游標打開的用戶數, |
FETCHES |
NUMBER |
與SQL陳述句關聯的FETCHES的次數 |
EXECUTIONS |
NUMBER |
自從物件被加載到類別庫快取后,該物件被執行次數, |
PX_SERVERS_EXECUTIONS |
NUMBER |
并行執行服務器執行的總次數 ( 當陳述句從未被并行執行時為0) |
END_OF_FETCH_COUNT |
NUMBER |
游標被加載到類別庫快取后,被完整執行的次數,當游標部分執行時,此統計值不會增加,不管是因為在執行程序中失敗,還是在關倍訓重新執行游標之前只提取了此游標生成的前幾行,根據定義,END_of_FETCH_COUNT列的值應小于或等于EXECUTIONS列的值, |
USERS_EXECUTING |
NUMBER |
執行陳述句的用戶數 |
LOADS |
NUMBER |
物件被加載或者重新加載的次數 |
FIRST_LOAD_TIME |
VARCHAR2(19) |
父游標的創建時間 |
INVALIDATIONS |
NUMBER |
子游標無效的次數 |
PARSE_CALLS |
NUMBER |
子游標的決議呼叫次數 |
DISK_READS |
NUMBER |
子游標的磁盤讀取次數 |
DIRECT_WRITES |
NUMBER |
子游標的直接寫次數 |
BUFFER_GETS |
NUMBER |
子游標的獲取快取區次數 |
APPLICATION_WAIT_TIME |
NUMBER |
應用等待時間(微秒為單位) |
CONCURRENCY_WAIT_TIME |
NUMBER |
并發等待時間(微秒為單位) |
CLUSTER_WAIT_TIME |
NUMBER |
集群等待時間(微秒為單位) |
USER_IO_WAIT_TIME |
NUMBER |
用戶I/O等待時間(微秒為單位) |
PLSQL_EXEC_TIME |
NUMBER |
PL/SQL執行時間(微秒為單位) |
JAVA_EXEC_TIME |
NUMBER |
Java執行時間(微秒為單位) |
ROWS_PROCESSED |
NUMBER |
已決議SQL陳述句回傳的總行數 |
COMMAND_TYPE |
NUMBER |
Oracle命令型別定義 |
OPTIMIZER_MODE |
VARCHAR2(10) |
SQL陳述句執行模式(優化器模型) |
OPTIMIZER_COST |
NUMBER |
優化器給出的查詢成本 |
PARSING_USER_ID |
NUMBER |
最初構建此子游標的用戶ID |
PARSING_SCHEMA_ID |
NUMBER |
最初構建子游標使用的模式ID |
PARSING_SCHEMA_NAME |
VARCHAR2(30) |
最初構建子游標使用的模式名稱 |
SERVICE |
VARCHAR2(64) |
服務名稱 |
SERVICE_HASH |
NUMBER |
SERVICE列展示的服務名稱的哈希值 |
MODULE |
VARCHAR2(64) |
SQL陳述句第一次被決議時正在執行的模塊名稱,該名稱可通過呼叫DBMS_APPLICATION_INFO.SET_MODULE進行設定, |
MODULE_HASH |
NUMBER |
MODULE列展示的模塊名稱的哈希值 |
SERIALIZABLE_ABORTS |
NUMBER |
每個游標事務序列化失敗并產生ORA-08177錯誤的次數 |
CPU_TIME |
NUMBER |
此游標用于決議,執行,獲取(fetch)的CPU耗時 (以微秒為單位) |
ELAPSED_TIME |
NUMBER |
此游標用于決議,執行,獲取的占用時間(以微秒為單位),如果游標采用并行執行,則ELAPSED_TIME 為查詢協調器及所有并行查詢slave行程的累計占用時間, |
OBJECT_STATUS |
VARCHAR2(19) |
游標的狀態:VALID - 有效,無錯誤授權 VALID_AUTH_ERROR - 有效,有授權錯誤授權,VALID_COMPILE_ERROR - 有效, 有編譯錯誤授權,VALID_UNAUTH - 有效,未授權,INVALID_UNAUTH - 無效,未授權,INVALID - 無效,未授權,但保留時間戳, |
LAST_LOAD_TIME |
VARCHAR2(19) |
查詢計劃被加載到類別庫快取的時間 |
IS_OBSOLETE |
VARCHAR2(1) |
指示游標是否已過時,是(Y) 或者否(N),如果子游標的數量太大,則可能發生這種情況, |
LAST_ACTIVE_TIME |
DATE |
查詢計劃最后活躍時間(即完成SQL決議的時間,可以當做SQL最后執行的時間) |
IO_INTERCONNECT_BYTES |
NUMBER |
Oracle 資料庫和存盤系統之間交換的I/O位元組數, |
PHYSICAL_READ_REQUESTS |
NUMBER |
被監控SQL發起的物理讀I/O請求 |
PHYSICAL_READ_BYTES |
NUMBER |
被監控SQL從磁盤讀取的位元組數, |
PHYSICAL_WRITE_REQUESTS |
NUMBER |
被監控SQL發起的物理寫I/O請求, |
PHYSICAL_WRITE_BYTES |
NUMBER |
被監控SQL寫入磁盤的位元組數 |
OPTIMIZED_PHY_READ_REQUESTS |
NUMBER |
被監控SQL從資料庫智能閃存快取發起的物理讀取I/O請求數 |
LOCKED_TOTAL |
NUMBER |
子游標被鎖定的總次數 |
V$SQLAREA顯示共享SQL區域的統計資訊,每條SQL字串為一行,它提供記憶體中、已決議并準備執行的SQL陳述句的統計資訊,V$SQLAREA和V$SQL兩個視圖的不同之處在于,V$SQL中為每一條SQL保留一個條目,而V$SQLAREA中根據SQL_TEXT進行GROUP BY,通過VERSION_COUNT計算子指標的個數
V$SESSION
V$SESSION 顯示當前會話的會話資訊,常見視圖欄位及欄位描述說明如下:
| 列 | 描述 |
|---|---|
SID |
會話ID |
SERIAL# |
會話序列號,用于唯一標識會話的物件,如果會話結束,而另一個會話以相同的會話ID開始,則保證將會話級命令應用于當前會話的物件, |
USER# |
Oracle用戶ID |
USERNAME |
Oracle用戶名稱 |
COMMAND |
正在執行的命令(決議的最后一條陳述句),可以通過運行以下SQL查詢來查找此COMMAND列中回傳的任何值 n 的命令名:SELECT Command_name FROM v$sqlcommand WHERE command_type=n COMMAND”列值為 0,則表示該命令未記錄在V$SESSION中, |
LOCKWAIT |
會話正在等待的鎖的地址,NULL值表示沒有等待鎖, |
STATUS |
會話狀態:ACTIVE-會話當前正在執行SQL,INACTIVE-處于非活動狀態且沒有配置限制或尚未超過配置的限制的會話,KILLED-標記為被終止的會話,CACHED-為Oracle XA臨時快取的會話,SNIPED-超出某些配置限制(例如,為資源管理器消費者組指定的資源限制或用戶組態檔中指定的idle_time)的非活動會話,此類會話將不允許再次激活, |
SCHEMA# |
Schema用戶ID |
SCHEMANAME |
Schema用戶名稱 |
OSUSER |
作業系統客戶端用戶名稱 |
PROCESS |
作業系統客戶端行程ID |
MACHINE |
作業系統機器名稱 |
PORT |
客戶端行程埠號 |
TERMINAL |
作業系統終端名稱 |
PROGRAM |
作業系統行程名稱 |
TYPE |
會話型別 |
SQL_HASH_VALUE |
配合 SQL_HASH_VALUE使用,用于標識當前正在執行的SQL陳述句, |
SQL_ID |
當前正在執行的SQL陳述句的ID |
SQL_EXEC_START |
會話當前執行的SQL開始執行的時間;如果SQL_ID為NULL,則為NULL |
SQL_EXEC_ID |
SQL執行標識, 如果SQL_ID為NULL或者該SQL執行還未啟動,則為NULL |
LAST_CALL_ET |
如果會話STATUS當前為ACTIVE,則該值表示自會話變為活動狀態以來經過的時間(以秒為單位),如果會話STATUS當前為INACTIVE,則該值表示自會話變為非活動狀態以來經過的時間(以秒為單位) |
EVENT |
如果會話當前正在等待,則為會話正在等待的資源或事件,如果會話不在等待中,則為會話最近等待的資源或事件,查閱: "Oracle Wait Events" |
V$LOCKED_OBJECT
V$LOCKED_OBECT列出了系統上每個事務獲取的所有鎖,它顯示了哪些會話在什么物件上以及在什么模式下持有DML鎖(即TM型別的佇列),視圖常見欄位及描述如下:
| 列 | 描述 |
|---|---|
OBJECT_ID |
正被鎖住的物件ID |
SESSION_ID |
會話ID |
ORACLE_USERNAME |
Oracle用戶名 |
OS_USER_NAME |
作業系統用戶名 |
PROCESS |
作業系統行程ID |
LOCKED_MODE |
鎖模式,此列的數值映射到表鎖的鎖模式的這些文本值:0-無:請求但尚未獲得的鎖;1-NULL;2-ROWS_S(SS):行共享鎖;3-Row_X(SX):行排它鎖;4-Share(S):共享表鎖;5-S/Row-X(SSX):共享行排它鎖;6-獨占(X):排它表鎖,另請參閱:Oracle資料庫概念,以獲取有關表鎖鎖模式的更多資訊 |
SELECT object_id "被鎖住的物件ID",
locked_mode "鎖模式",
session_id "會話ID",
oracle_username "Oracle用戶名",
os_user_name "作業系統用戶名",
process "作業系統行程ID"
FROM V$LOCKED_OBJECT;
參考連接
https://docs.oracle.com/database/121/REFRN/GUID-2B9340D7-4AA8-4894-94C0-D5990F67BE75.htm#REFRN30246
https://docs.oracle.com/database/121/REFRN/GUID-09D5169F-EE9E-4297-8E01-8D191D87BDF7.htm#REFRN30259
https://docs.oracle.com/en/database/oracle/oracle-database/21/refrn/V-SESSION.html
https://docs.oracle.com/en/database/oracle/oracle-database/21/refrn/V-LOCKED_OBJECT.html#GUID-3F9F26AA-197F-4D36-939E-FAF1EFD8C0DD
作者:授客
微信/QQ:1033553122
全國軟體測驗QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞后如有任何疑問,請聯系我!!!
微信打賞
支付寶打賞 全國軟體測驗交流QQ群
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553676.html
標籤:Oracle
上一篇:[20230517]建立索引導致的性能問題2.txt
下一篇:返回列表
