對openrowset又愛又恨.........
愛的是讀外部資料檔很方便...恨的是不預期的卡住永世不得翻身....
終於找到一個可以解決卡住的方法...但為什麼會不預期卡住仍待努力。
參考這篇
SQL Server 2016 Linked Server OPENQUERY Hangs
去https://docs.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite
下載Sysinternals Suite,裡面真的好物...
找到Process Explorer(procexp64.exe)工具打開後,刪除
dllhost.exe 是
OLE DB Core Services的,且
CPU狀態是Suspend的(但有遇到狀態沒有Suspend也是卡住的狀況)。
之前為了測試如何刪除openrowset session,已將連結的伺服器linked server中的microsoft.ACE.OLEDB.16.0 的允許InProcess停用,所以不確定是否得要這麼設才有
dllhost.exe可刪。
借用截圖
2022/10/02 今天測試了一會,由事件檢視器訊息來看,
失敗的應用程式名稱: DllHost.exe,版本: 10.0.17763.1,時間戳記: 0x5d3b6f40
失敗的模組名稱: mso20win32client.dll,版本: 16.0.5254.1001,時間戳記: 0x61aca05e
例外狀況代碼: 0xc0000005
錯誤位移: 0x00000000000c57f2
失敗的處理程序識別碼: 0x920c
失敗的應用程式開始時間: 0x01d8d5b4a1a5e9b1
失敗的應用程式路徑: C:\Windows\system32\DllHost.exe
失敗的模組路徑: C:\Program Files\Common Files\Microsoft Shared\Office16\mso20win32client.dll
報告識別碼: a950796e-1eb0-49b8-b76b-4145e6c8b4c9
失敗的套件完整名稱:
失敗的套件相關應用程式識別碼:
今天剛好測到一次讀三個外部檔,終於遇到了客戶常發生的狀況,openrowset的查詢又hang住了。
反覆測了好幾回,分別在WEB AP 及SSMS環境測試,發現在SSMS成功機率較高,在AP沒有一次查詢成功? 同樣的SQL在連線的DB,唯一的差別就是執行環境了。
瞎測一番後,好像在每個openrowset查詢間加了waitfor delay '00:00:10' 停個10秒再執行下一段openrowset,結果執行了幾次,竟然都可正常回傳結果。
怪哉~~~~~
2022/11/24
這個問題看來無解
https://blog.sqlauthority.com/2017/03/08/sql-server-queries-killedrollback-state-wait-preemptive_oledb_release/
唯一能做的是重啟SQL SERVER服務釋放SPID。
所以設成
InProcess停用後,就直接執行exec xp_cmdshell 'taskkill /f /im dllhost.exe'
把卡住的dllhosrt kill掉,通常再執行一次openrowset又可正常回傳資料了。