Sql-Server

無法從連結伺服器的 OLE DB 提供程序“SQLNCLI11”獲取行

  • February 15, 2021

我在雲中某處(可能是 Azure)的兩台不同機器上有兩個 SQL Server。

一種是 Microsoft SQL Server 2012 (SP3-CU10) (KB4025925) - 11.0.6607.3 (X64) Jul 8 2017 16:43:40 版權所有 (c) Microsoft Corporation Standard Edition (64-bit) o​​n Windows NT 6.3 (Build 9600: )(管理程序)

在這台伺服器上有一個到第二台伺服器的連結。

第二台伺服器 ( aae-sqldw-02) 是 Microsoft SQL Server 2016 (SP1-CU15-GDR) (KB4505221) - 13.0.4604.0 (X64) Jun 15 2019 07:56:34 版權所有 (c) Microsoft Corporation Enterprise Edition:基於核心的許可 (64 -bit) 在 Windows Server 2016 Datacenter 10.0 (Build 14393:) (Hypervisor) 上

在第一台伺服器上,我們正​​在執行“簡單”查詢:

TRUNCATE TABLE [dbo].[LocalTable]

INSERT INTO [dbo].[LocalTable]
   ([DatabaseName]
   ,[SalesContractNumber]
   ,... 60 columns
   )
SELECT
   convert(varchar(128), DatabaseName) collate Latin1_General_CI_AS
   ,convert(varchar(60), SalesContractNumber) collate Latin1_General_CI_AS
   ,... 60 columns
FROM [aae-sqldw-02].[Fin_DWH].[dbo].[RemoteView]
WHERE DatabaseName = 'somename'

此查詢有時會失敗並出現錯誤:

Cannot fetch a row from OLE DB provider "SQLNCLI11" for linked server "aae-sqldw-02".

或出現此錯誤:

Cannot fetch the rowset from OLE DB provider "SQLNCLI11" for linked server "aae-sqldw-02". .

我知道第二台伺服器一天中的大部分時間都承受著非常重的負載。它實際上最大化了它的磁碟 IO(255MB/秒)。蠻力解決方案是簡單地將其移至具有更多 IO 的更昂貴的計劃。這種變化需要大量的官僚主義,並且需要很長時間。此外,不能保證下一層就足夠了。

伺服器負載

我現在可以用給定的資源做些什麼嗎?

查詢成功完成後,可能需要 1-3 小時。該查詢返回大約 3M 行,大約 4GB 的數據,所以不會太多。

當查詢失敗時Cannot fetch a row,最後幾次在 9294 秒(2.5 小時)、12326 秒(3.5 小時)後失敗。

當查詢失敗時Cannot fetch the rowset,它在 606 秒、611 秒後失敗。

因此,600 秒建議一些預設的 10 分鐘超時(用於連接?)在連接成功的情況下,它開始獲取數據,但在此過程中失敗。也許連結伺服器無法足夠快地發送下一行,並且出現了其他一些超時。

查詢成功時,上次耗時 3841 秒。

以下是連結伺服器的設置:

EXEC master.dbo.sp_addlinkedserver @server = N'aae-sqldw-02', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'aae-sqldw-02',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO

EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'collation compatible', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'data access', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'dist', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'pub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'rpc', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'rpc out', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'sub', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'connect timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'collation name', @optvalue=null
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'lazy schema validation', @optvalue=N'false'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'query timeout', @optvalue=N'0'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'use remote collation', @optvalue=N'true'
EXEC master.dbo.sp_serveroption @server=N'aae-sqldw-02', @optname=N'remote proc transaction promotion', @optvalue=N'true'

query timeout你怎麼看,如果我明確地將選項設置為 5 小時,會有什麼不同嗎?它能讓事情變得更糟嗎?

顯然,正確的解決方法是查看伺服器上發生的事情並優化查詢以減少整體負載,但是我可以在更高的伺服器/數據庫級別做些什麼,以便查詢完成,即使真的需要很長時間嗎?

我們需要每週執行一次這個查詢,現在我們必須重試幾次,直到它成功完成。

根據我們在評論中的討論,我認為此Microsoft 文件可能是您正在尋找的內容,但我覺得這僅適用於本地實例,您將無法在 Azure 中進行調整。

我還發現了一個與StackOverflow 相關的文章,其中接受的答案是為高度密集的IO工作負載增加****DTU,即使您只是暫時擴大規模以執行該查詢並在完成後縮小規模。(再次擴展到基於 NVMe 的層可能會在這裡獲得巨大的回報。)

不幸的是,您收到的錯誤沒有很多具體資訊,而且原因各不相同。我發現唯一可能與您的案例相關的是這個StackExchange 文章,其中問題是由於連結伺服器上發生的死鎖。也許您遇到了同樣的問題?(從理論上講,這可能是由於您的伺服器在IO最大化時抓取其他並發執行的查詢而導致的時間問題。)

除此之外,我認為您擁有的唯一其他選擇是調整查詢本身以提高性能。即使在這里以約 250 MB/s 的 IO 被限制,4 GB 的數據應該在大約 16 秒內處理 + 任何可能為網路延遲添加的瓶頸。但是 1 小時以上的時間肯定會消失,即使是 300 萬行(死鎖似乎更可疑)。對於您遇到的錯誤本身並不直接是超時錯誤,我會考慮與 Azure 代表交談,看看您的潛在問題是否還有其他問題。

引用自:https://dba.stackexchange.com/questions/285398