OLEDB等待事件介紹 OLEDB等待類型是SQL SERVER 資料庫中最常見的幾種等待類型之一。它意味著某個會話(SPID)通過SQL Server Native Client OLEDB Provider發生了調用請求並等待資料庫返回所需的數據。它出現在遠程系統(remote system )...
OLEDB等待事件介紹
OLEDB等待類型是SQL SERVER 資料庫中最常見的幾種等待類型之一。它意味著某個會話(SPID)通過SQL Server Native Client OLEDB Provider發生了調用請求並等待資料庫返回所需的數據。它出現在遠程系統(remote system )或網路連接速度不夠快,因此調用伺服器必須等待要返回結果的情況下。OLEDB等待事件一般是由那些活動造成呢?它一般由下麵一些事件引起:
- 遠程過程調用(Remote procedure calls)
- 鏈接伺服器查詢(Linked server queries)
- BULK INSERT commands
- Full-search queries 或外部數據源處理,例如Excel
- 客戶端的Profiler跟蹤(Client-side Profiler traces)
- DMV, log reader and DBCC CHECKDB
看到DBCC CHECKDB會引起OLEDB等待事件,你是否覺得很奇怪,其實剛開始的時候我也覺得很奇怪,我們的DPA(Database Performance Analyzer)監控工具發現SQL 2012、SQL 2014資料庫的DBCC CHECKDB引起的OLEDB等待事件占據了等待類型柱狀圖很大的比例。這個引起了我的好奇心,後面查證後發現DBCC CHECKDB它使用 OLEDB 行集在查詢處理器和存儲引擎的子系統之間交換信息。
下麵演示一下DBCC CHECKDB出現OLEDB等待事件的例子:
--SESSION 1
DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR);
GO
DBCC CHECKDB('AdventureWorks2014');
--SESSION 2
SELECT * FROM
sys.dm_os_wait_stats
WHERE wait_type='OLEDB'
在DBCC CHECKDB還在執行時,你在會話2中,會看到OLEDB等待類型的waiting_tasks_count、wait_time_ms會一直增加。關於DBCC CHECKDB產生的OLEDB等待事件,我從DPA裡面觀察,發現SQL Server 2012、SQL Server 2014明顯要比SQL Server 2005、 SQL Server 2008要多,暫時不清楚具體原因,在SQL SERVER 2012/2014中DBCC CHECKDB出現了幾個Bug,具體可以參考官方文檔SQL Server 2014 Service Pack 1 release information 。我們可以看到官方已經Fix掉了三個關於DBCC CHECKDB的Bug。但是我更新了這些補丁,依然發現DBCC CHECKDB引起的OLEDB等待事件較多。
另外關於DMV會引起OLEDB等待事件,是因為DMV內部使用了OLEDB,因此一些監測工具頻繁調用DMV也會導致出現較多OLEDB等待事件。
OLEDB等待事件解決
1:從應用層面考慮,只返回必要的欄位和數據。減少網路傳輸內容和時間。從而減少OLEDB等待事件。例如分頁控制項的按頁獲取數據。
2:如果使用Linked Server獲取的數據是靜態數據,可以考慮將這些靜態數據複製到本地資料庫,減少沒有必要的鏈接伺服器查詢。如果數據是動態變化,也可以考慮使用使用複製(發佈訂閱)將數據同步到本地資料庫。
3:從業務角度出發審查你的數據分佈,鏈接伺服器查詢是否絕對有必要?那些是可以減少、那些不必要的?另外 ,可以從架構層面考慮解決,例如將那些數據集中起來。
4:如果有些數據源是Excel文件,可以先將其通過FTP或文件共用上傳到本機,然後處理數據。
5: 優化鏈接伺服器查詢的SQL,檢查其是否缺少索引、統計信息是否過時;是否可以將某些業務邏輯放置到遠程伺服器上去處理(存儲過程),然後只返回需要的數據。例如下麵這種需求。
SELECT * FROM
linked_server.dbo.table_a inner join ..
linked_server.dbo.table_b inner join ..
linked_server.dbo.table_c inner join ..
.......................
6:找系統管理員或網路管理員瞭解專線帶寬等情況。有時候網路帶寬資源不足時也是引起OLEDB等待事件增多的原因。