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等待事件增多的原因。