Oracle 死鎖與慢查詢總結

来源:https://www.cnblogs.com/shouke/archive/2023/05/28/17437893.html
-Advertisement-
Play Games

## 查看死鎖 ```sql SELECT s.sid "會話ID", s.lockwait "等待鎖", s.event "等待的資源/事件", -- 最近等待或正在等待的資源/事件 DECODE(lo.locked_mode, 0, '尚未獲得鎖', 1, NULL, 2, '行共用鎖', 3, ...


查看死鎖

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 = 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),並且statusACTIVE,則說明存在死鎖

  • 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$SQLAREAV$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_IDNULL,則為NULL
SQL_EXEC_ID SQL執行標識。 如果SQL_IDNULL或者該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群  
              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # Unity IPostBuildPlayerScriptDLLs Unity IPostBuildPlayerScriptDLLs是Unity引擎中的一個非常有用的功能,它可以讓開發者在構建項目後自定義哪些文件需要被覆制到輸出目錄中。這個功能可以幫助開發者更好地控制項目的構建過程,確保輸出目錄只 ...
  • # Unity IPreprocessBuild Unity IPreprocessBuild是Unity引擎中的一個非常有用的功能,它可以讓開發者在構建項目時自動執行一些操作。這個功能可以幫助開發者提高工作效率,減少手動操作的時間和錯誤率。在本文中我們將介紹Unity IPreprocessBui ...
  • # Unity中的PostProcessBuild:深入解析與實用案例 在Unity游戲開發中,我們經常需要在構建完成後對生成的應用程式進行一些額外的處理。這時,我們可以使用Unity提供的`PostProcessBuild`功能。本文將詳細介紹Unity中的`PostProcessBuild`方法 ...
  • # Unity中的InitializeOnLoad特性:深入解析與實踐 在Unity開發過程中,我們經常需要在編輯器啟動時或腳本重新編譯後執行一些操作,例如初始化數據、註冊事件等。這時,我們可以使用`InitializeOnLoad`特性來實現這一需求。本文將詳細介紹`InitializeOnLoa ...
  • **一、什麼是PID** 學過自動控制原理的對PID並不陌生,PID控制是對偏差信號e(t)進行比例、積分和微分運算變換後形成的一種控制規律。PID 演算法的一般形式: ![](https://img2023.cnblogs.com/blog/2776504/202305/2776504-202305 ...
  • # 協程 > 線程分為用戶級線程,內核級線程和輕量級線程。Linux中使用的是輕量級線程,而協程雖然是運行線上程之上,但是是run在用戶空間。並且協程和線程一樣,擁有自己的調度器、cpu的上下文切換等。 > > 協程在我個人看來是一種用戶級線程; > > - 這是因為對於cpu有上下文的切換,而且是 ...
  • # 痞子衡嵌入式半月刊: 第 77 期 ![](http://henjay724.com/image/cnblogs/pzh_mcu_bi_weekly.PNG) 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitH ...
  • Ethernet over EtherCAT (EoE) 是一種通信協議,它允許通過網路連接訪問從站設備的參數,以便配置和診斷從站設備。EoE 允許將常見的互聯網協議(如 HTTP、FTP 等)的數據插入到 EtherCAT 協議數據中,而不影響 EtherCAT 過程數據 ,那ETherCAT主站... ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...