sql server資料庫select產生嚴重阻塞引起效能問題
今天處理了一個問題,因為sql server資料庫查詢阻塞引起的。
首先,在資料庫上面檢視,存在大量的阻塞:
SELECT a.blocking_session_id, a.wait_duration_ms, a.session_id,b.text
FROM sys.dm_os_waiting_tasks a,
(SELECT t.text ,c.session_id
FROM sys.dm_exec_connections c
CROSS APPLY sys.dm_exec_sql_text (c.most_recent_sql_handle) t) b
WHERE a.session_id = b.session_id and a.blocking_session_id IS NOT NULL
從查詢的結果來看,均是select阻塞,然後對該select 語句對某個大表進行全表掃描,長時間進行,阻塞其它會話,使得資料庫效能極具下降!從活動會話分析來看,佔用了大量cpu。
出現這種情況,主要是由於sql server的封鎖機制引起的。
sql server的隔離級別分為兩種,這兩種隔離級別都是透過行版本控制在tempdb中生成資料的複本來解決資料的寫和讀的時候發生鎖及阻塞的問題的。不過snapshot isolation需要在資料庫中執行
ALTER DATABASE Aesop SET ALLOW_SNAPSHOT_ISOLATION ON
之後,然後在執行事務之前,設定連線的隔離級別
SET TRANSACTION ISOLATION LEVEL Snapshot;
BEGIN TRAN
SELECT Title
FROM FABLE
WHERE FableID = 2
這時候當發生第二個事務對fableid=2的行進行更新的時候,它可以進行更新,但是在更新事務提交之後,查詢事務依然是無法查到更新事務所做的修改,它還是隻能查詢到原始的資料,這種情況類似於repeatable read隔離級別,但是在repeatable read下,更新事務是無法更新的,直到查詢事務提交之後才可以。有的類似oracle的髒讀機制。
Read Committed Snapshot Isolation只是針對sqlserver預設的read committed隔離級別的。使用它需要執行如下sql:
ALTER DATABASE Aesop SET READ_COMMITTED_SNAPSHOT ON;
如果資料庫只是普通的read committed級別下,當執行一個更新事務但沒有提交時,再執行一個對更新資料進行查詢的事務,查詢事務將無法查詢,被阻塞,但是在 READ_COMMITTED_SNAPSHOT被開啟的情況下,在上面那種情況中,查詢事務將不會被阻塞,它能夠查詢到未更新前的資料。
Snapshot Isolation是針對SET TRANSACTION ISOLATION LEVEL Snapshot;的,在使用的時候需要在事務前設定隔離級別,而Read Committed Snapshot Isolation完全不需要使用set transaction isolation,因為它是針對資料預設的read committed隔離級別的。
而本資料庫是採用的off,所以才出現以上的這種情況。跟開發商溝通後,他們認為不能開啟,會影響業務!
首先,在資料庫上面檢視,存在大量的阻塞:
SELECT a.blocking_session_id, a.wait_duration_ms, a.session_id,b.text
FROM sys.dm_os_waiting_tasks a,
(SELECT t.text ,c.session_id
FROM sys.dm_exec_connections c
CROSS APPLY sys.dm_exec_sql_text (c.most_recent_sql_handle) t) b
WHERE a.session_id = b.session_id and a.blocking_session_id IS NOT NULL
從查詢的結果來看,均是select阻塞,然後對該select 語句對某個大表進行全表掃描,長時間進行,阻塞其它會話,使得資料庫效能極具下降!從活動會話分析來看,佔用了大量cpu。
出現這種情況,主要是由於sql server的封鎖機制引起的。
sql server的隔離級別分為兩種,這兩種隔離級別都是透過行版本控制在tempdb中生成資料的複本來解決資料的寫和讀的時候發生鎖及阻塞的問題的。不過snapshot isolation需要在資料庫中執行
ALTER DATABASE Aesop SET ALLOW_SNAPSHOT_ISOLATION ON
之後,然後在執行事務之前,設定連線的隔離級別
SET TRANSACTION ISOLATION LEVEL Snapshot;
BEGIN TRAN
SELECT Title
FROM FABLE
WHERE FableID = 2
這時候當發生第二個事務對fableid=2的行進行更新的時候,它可以進行更新,但是在更新事務提交之後,查詢事務依然是無法查到更新事務所做的修改,它還是隻能查詢到原始的資料,這種情況類似於repeatable read隔離級別,但是在repeatable read下,更新事務是無法更新的,直到查詢事務提交之後才可以。有的類似oracle的髒讀機制。
Read Committed Snapshot Isolation只是針對sqlserver預設的read committed隔離級別的。使用它需要執行如下sql:
ALTER DATABASE Aesop SET READ_COMMITTED_SNAPSHOT ON;
如果資料庫只是普通的read committed級別下,當執行一個更新事務但沒有提交時,再執行一個對更新資料進行查詢的事務,查詢事務將無法查詢,被阻塞,但是在 READ_COMMITTED_SNAPSHOT被開啟的情況下,在上面那種情況中,查詢事務將不會被阻塞,它能夠查詢到未更新前的資料。
Snapshot Isolation是針對SET TRANSACTION ISOLATION LEVEL Snapshot;的,在使用的時候需要在事務前設定隔離級別,而Read Committed Snapshot Isolation完全不需要使用set transaction isolation,因為它是針對資料預設的read committed隔離級別的。
而本資料庫是採用的off,所以才出現以上的這種情況。跟開發商溝通後,他們認為不能開啟,會影響業務!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-1270079/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server中的SELECT會阻塞SELECT相關資料SQLServer
- update引起資料庫阻塞資料庫
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- Sql Server 資料庫超時問題SQLServer資料庫
- sql server 資料庫還原問題SQLServer資料庫
- 資料庫Server效能問題分析案例一資料庫Server
- 記憶體洩漏引起的 資料庫效能問題記憶體資料庫
- SQL Server資料庫恢復常見問題SQLServer資料庫
- 深入SQL Server資料庫速度提升問題(一)SQLServer資料庫
- 深入SQL Server資料庫速度提升問題(二)SQLServer資料庫
- 【原創】由隱式轉換引起的資料庫效能問題資料庫
- Laravel 5.2 的一處嚴重效能問題Laravel
- mybatisplus 配置引起的生產問題 no bean ‘sqlSessionFactory‘MyBatisBeanSQLSession
- iOS 12.1.4更新修復嚴重安全漏洞 但又產生新問題iOS
- 資料庫SQL Server DAC 匯入匯出資料到SQL Azure問題資料庫SQLServer
- 資料庫自增主鍵可能產生的問題資料庫
- SQL Server資料庫記憶體增加的問題分析SQLServer資料庫記憶體
- 一次sql server2012 AwaysON只讀節點嚴重阻塞分析SQLServer
- SQL Server 資料庫 最佳化 效能瓶頸SQLServer資料庫
- SQL執行計劃異常引起的效能問題SQL
- SQL執行計劃異常 引起的效能問題SQL
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- 關於jsp 呼叫bean 訪問sql-server資料庫問題JSBeanSQLServer資料庫
- SQL語句select隨機調取10行資料 Access/SQL Server/Mysql等資料庫隨機ServerMySql資料庫
- SQL Server 資料庫開發中的十大問題VYSQLServer資料庫
- SQL Server資料庫中處理空值時常見問題SQLServer資料庫
- 【資料庫資料恢復】SQL SERVER資料庫MDF (NDF)或LDF損壞問題如何解決?資料庫資料恢復SQLServer
- SQL Server資料庫安全SQLServer資料庫
- SQL Server 資料庫映象SQLServer資料庫
- SQL Server 資料庫索引SQLServer資料庫索引
- 資料庫映象 (SQL Server)資料庫SQLServer
- 為什麼忘記commit也會造成select查詢的效能問題(SELECT產生Redo的情形)MIT
- 包含OLAP元件SCHEMA使用imp匯入碰到嚴重效能問題元件
- 解決SQL Server資料庫維護計劃失敗的問題SQLServer資料庫
- 線上重定義引起的資料庫掛起資料庫
- 資料庫效能 常用SQL資料庫SQL
- SQL Server收縮資料庫SQLServer資料庫
- 管理SQL Server資料庫安全SQLServer資料庫