透過等待看資料庫
等待分類與解決基本流程
步驟
1.
定位問題
如:系統中存在大量IO類等待,那麼可能表示你的磁碟或記憶體是語句執行緩慢的原因,也是系統的瓶頸所在。
常見的等待型別:
-
CXPACKET :當嘗試同步查詢處理器交換迭代器時出現。如果針對該等待型別的爭用成為問題時,可以考慮降低並行度。
-
IO_COMPLETION :在等待 I/O 操作完成時出現。通常,該等待型別表示非資料頁 I/O。
-
PAGEIOLATCH_ :在任務等待 I/O 請求中緩衝區的閂鎖時發生。
-
PAGELATCH_ :在任務等待不處於 I/O 請求中的緩衝區閂鎖時發生。
-
LCK_ :等待閂鎖時出現。
-
ASYNC_NETWORK_IO :當任務被阻止在網路之後時出現在網路寫入中。驗證客戶端是否正在處理來自伺服器的資料。
-
OLEDB :當SQL Server 呼叫 Microsoft SQL Native Client OLE DB 訪問介面時出現。該等待型別不用於同步。而是用於指示呼叫 OLE DB 訪問介面的持續時間。
-
WRITELOG :等待日誌重新整理完成時出現。導致日誌重新整理的常見操作是檢查點和事務提交。
步驟 2. 分析
問題與解決
CXPACKET
如果 CXPACKET 在你係統中是最為嚴重的等待,這時候一般的表現是你的CPU很高。
解決方案:適當調整並行度。
並行開銷的閥值,主要控制SQL最佳化器何時選用並行計劃,建議預設值,此值設定的越小最佳化器越容易選擇並行計劃。
並行度的設定是針對例項級別的設定(2016中可以對單獨資料庫設定)。
IO 類
這裡用PAGEIOLATCH_ 為例進行說明
PAGEIOLATCH_ 的相關等待:
PAGEIOLATCH_DT |
在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“破壞”模式。長時間的等待可能指示磁碟子系統出現問題。 |
PAGEIOLATCH_EX |
在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“獨佔”模式。長時間的等待可能指示磁碟子系統出現問題。 |
PAGEIOLATCH_KP |
在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“保持”模式。長時間的等待可能指示磁碟子系統出現問題。 |
PAGEIOLATCH_NL |
僅供內部使用。 |
PAGEIOLATCH_SH |
在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“共享”模式。長時間的等待可能指示磁碟子系統出現問題。 |
PAGEIOLATCH_UP |
在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“更新”模式。長時間的等待可能指示磁碟子系統出現問題。 |
怎麼來理解這個官方解釋呢?首先明確一點,作業系統CPU操作的任何資料都是從記憶體中讀取的,也就是說讀取資料要經過這樣的一條路:
磁碟中 ——> 記憶體中 ——> 最終使用
這裡的PAGEIOLATCH_ 就是發生在,磁碟中 ——> 記憶體中
以讀取為例:要讀取的資料頁不在記憶體中,所以就要去磁碟上讀取這部分資料頁,去磁碟讀取資料的時候就會產生PAGEIOLATCH_的相關等待,如果磁碟壓力大,長時間不能反回資料,那麼PAGEIOLATCH_的時間也會越長,語句執行的時間也會越長。
PAGELATCH_
PAGELATCH_ 和 上面講述的PAGEIOLATCH_ 看似很像,但中間少了 IO 這個關鍵。
磁碟中 ——> 記憶體中 ——> 最終使用
磁碟中——>記憶體中 的等待為PAGEIOLATCH_ 而記憶體中——> 最終使用 的等待為 PAGELATCH_
當資料已經在記憶體中的時候SQL SERVER 想要使用這個資料頁就要給這個資料頁加鎖。
當等待中出現很多PAGELATCH_ 等待,那麼可以說明:
-
SQL Server 沒有明顯的記憶體和磁碟瓶頸。
-
應用程式發來大量的併發語句在修改同一張表格裡的記錄,而表格架構設計以及使用者業務邏輯使得這些修改都集中在同一個頁面,或者數量不多的幾個頁面上。這些頁面有的時候也被稱為Hot Page。這樣的瓶頸通常只會發生在併發使用者比較多的、典型的OLTP系統上。
-
這種瓶頸是無法透過提高硬體配置解決的,只有透過修改表格設計或者業務邏輯,讓修改分散到儘可能多的頁面上,才能提高併發效能。
LCK_
LCK_ 型別中的所有很多,如果這種等待在系統中大量存在,可以說明,系統語句間的相互阻塞嚴重。如大家都知道的當你update一張表的時候,你的select會被阻塞直到update完成。這裡就不過多介紹場景了,主要看一下解決此類等待的主要方法:
-
語句最佳化,讓語句執行的更快,減少等待時間。
-
採用批次操作代替迴圈方式。
-
儘量減少事務的長度。
-
嘗試降低事務隔離級別。
-
上述都不能緩解...請選用讀寫分離。
LCK_ 型別中包含:(這裡不做詳細解讀了)
LCK_M_RIn_NL |
當某任務正在等待獲取當前鍵值上的 NULL 鎖以及當前鍵和上一個鍵之間的插入範圍鎖時出現。鍵上的 NULL 鎖是指立即釋放的鎖。有關鎖相容性矩陣,請參閱: sys.dm_tran_locks |
LCK_M_RIn_S |
當某任務正在等待獲取當前鍵值上的共享鎖以及當前鍵和上一個鍵之間的插入範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RIn_U |
任務正在等待獲取當前鍵值上的更新鎖以及當前鍵和上一個鍵之間的插入範圍鎖。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RIn_X |
當某任務正在等待獲取當前鍵值上的排他鎖以及當前鍵和上一個鍵之間的插入範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RS_S |
當某任務正在等待獲取當前鍵值上的共享鎖以及當前鍵和上一個鍵之間的共享範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RS_U |
當某任務正在等待獲取當前鍵值上的更新鎖以及當前鍵和上一個鍵之間的更新範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RX_S |
當某任務正在等待獲取當前鍵值上的共享鎖以及當前鍵和上一個鍵之間的排他範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RX_U |
當某任務正在等待獲取當前鍵值上的更新鎖以及當前鍵和上一個鍵之間的排他範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_RX_X |
當某任務正在等待獲取當前鍵值上的排他鎖以及當前鍵和上一個鍵之間的排他範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_S |
當某任務正在等待獲取共享鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_SCH_M |
當某任務正在等待獲取架構修改鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_SCH_S |
當某任務正在等待獲取架構共享鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_SIU |
當某任務正在等待獲取共享意向更新鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_SIX |
當某任務正在等待獲取共享意向排他鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_U |
當某任務正在等待獲取更新鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_UIX |
當某任務正在等待獲取更新意向排他鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
LCK_M_X |
當某任務正在等待獲取排他鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks 。 |
ASYNC_NETWORK_IO
此等待狀態出現在SQLServer已經把資料準備好,但是網路沒有足夠的傳送速度跟上,所以SQLServer的資料沒地方存放。
-
出現這種情況一般不是資料庫的問題,調整資料庫配置不會有大的幫助。
-
網路層的瓶頸當然是一個可能的原因:對此要考慮是否真有必要返回那麼多資料?
-
應用程式端的效能問題,也會導致SQLServer裡的ASYNC_NETWORK_IO等待。如果見到了這個型別的等待,就要檢查應用程式的健康狀況,也要檢查應用是否有必要想SQLServer申請這麼大的結果集。
-
程式返回結果集的方式。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70023658/viewspace-2939497/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何透過SQLyog分析MySQL資料庫MySql資料庫
- 【資料庫資料恢復】透過資料頁恢復Sql Server資料庫資料的過程資料庫資料恢復SQLServer
- 【磐維資料庫】透過python訪問磐維資料庫資料庫Python
- 【YashanDB資料庫】PHP無法透過ODBC連線到資料庫資料庫PHP
- 如何透過一條資料庫語句做資料分析資料庫
- 【資料庫資料恢復】透過恢復NDF檔案修復資料庫的資料恢復過程資料庫資料恢復
- 如何透過.dbf檔案還原資料庫資料庫
- 天雲資料Hubble資料庫透過信通院首批HTAP資料庫產品評測資料庫
- MySQL資料庫故障分析-鎖等待(一)MySql資料庫
- 阿里雲PolarDB-X資料庫透過分散式資料庫金融標準驗證阿里資料庫分散式
- 透過修改控制檔案scn推進資料庫scn資料庫
- 伺服器資料恢復—透過拼接資料庫碎片恢復SqlServer資料庫資料的資料恢復案例伺服器資料恢復資料庫SQLServer
- 查詢資料庫等待事件top10資料庫事件
- 厲害了!12秒將百萬資料透過EasyExcel匯入MySQL資料庫中ExcelMySql資料庫
- 如何透過holer從外網訪問本地的資料庫?資料庫
- 在玩客雲上透過docker部署zabbix(PostgreSQL資料庫)DockerSQL資料庫
- flink 透過繼承RichSinkFunction實現自定義sink,將資料錄入資料庫繼承Function資料庫
- oracle資料庫透過sqlplus連線的幾種方式介紹Oracle資料庫SQL
- 透過預熱來最佳化PG資料庫的SQL效能資料庫SQL
- 一種透過延遲事務提升資料庫效能的方法資料庫
- 透過自研資料庫畫像工具支援“去O”評估資料庫
- Oracle透過ODBC連線SQL Server資料庫後ORA-12514OracleSQLServer資料庫
- Oracle資料庫由dataguard備庫引起的log file sync等待Oracle資料庫
- MySQL 透過 binlog 恢復資料MySql
- 滲透之——資料庫提權資料庫
- 【資料庫】資料庫儲存過程(一)資料庫儲存過程
- 透過v$wait_chains檢視診斷資料庫hang和ContentionAI資料庫
- TiDB 首批透過信通院 HTAP 資料庫基礎能力評測TiDB資料庫
- 透過三消看遊戲本質遊戲
- 透過Baba is you看「玩點敘述」
- 透過spark將資料儲存到elasticsearchSparkElasticsearch
- 【Mysql】如何透過binlog恢復資料MySql
- 透過Python SDK 獲取tushare資料Python
- 透過API介面實現資料探勘?API
- Linux上透過binlog檔案恢復mysql資料庫詳細步驟LinuxMySql資料庫
- 權威認可!OceanBase 透過分散式資料庫金融標準驗證分散式資料庫
- MySQL使用event等待事件進行資料庫效能診斷MySql事件資料庫
- 金倉資料庫KingbaseES等待事件之LWLock lock_manager資料庫事件