链接服务器的替代方案,具有相同的速度

时间:2018-03-26 08:31:01

标签: sql-server stored-procedures linked-server sqlclr openrowset

我有一个带有存储过程的框架构建,它将数据1到1从OLTP移动到BI临时区域。它是通用的,只需告诉它OLTP中的哪个表,并构建sql来移动它。

问题是,构建使用链接服务器到OLTP服务器。 现在,OLTP开始向表中添加像地理一样的CLR类型列,这些列无法通过链接服务器收集。

我一直在寻找OPENROWSET来完成这项工作,以保持存储过程解决方案并做最少的工作

首先,我尝试使用没有clr列的表,并发现使用ODBC通过' MSDASQL'比链接服务器慢4倍(尽管我使用最新的odbc驱动程序,我们为sql server 2016做了)

如果我在我的测试环境中使用

OPENROWSET('SQLNCLI', 'Server=my server;Trusted_Connection=yes;' select ...)

速度与链接服务器相同,但SQLNCLI实际上是使用链接服务器。 如果我选择具有CLR类型的表,它会按预期失败,因此这不是解决方案。

我知道如果我开始在SSIS中构建相同的通用设置,我将不会看到这些问题,但需要更长的时间来开发。我还可以设置复制,日志传送或其他新解决方案,但在此之前我想确保通过更改现有解决方案无法完成。

所以在我开始这样做之前,如果我想改变的是我框架中产生的tsql,你对我如何获得更好的吞吐量有什么建议吗?(OLTP和BI服务器都是SQL Server 2016)

非常简化,当前产生的tsql是这样的:

SELECT  *
FROM OLTP.BrokerServices.[FLEUR].[InsuredUnemploymentPayment]

其中OLTP是链接服务器。

我想以这样的结局结束:

SELECT *
FROM OPENROWSET(
                'MSDASQL', 
                'Driver={SQL Server Native Client 11.0}; Server=DFDGSQLCLU2003\SQL2016;UID=yyyyyyyyyyyy; PWD=xxxxxxxxxxx;',  
                'SELECT * FROM [BrokerServices].[FLEUR].[InsuredUnemploymentPayment]'
                )

上述工作,但至少比使用链接服务器慢4倍,而且我们没有那么多时间。

TIA

彼得

1 个答案:

答案 0 :(得分:2)

我实际上自己找到了答案:-) 使用SQLOLEDB而不是MSDASQL,提供了我想要的性能,并且可以处理CLR数据类型:

SELECT *
FROM OPENROWSET(
                'SQLOLEDB', 
                'STARDBS1006\T16';'yyyyyyyyyy';'xxxxxxxxxxx',  
                'SELECT * FROM [BrokerServices].[FLEUR].[InsuredUnemploymentPayment]'
                )

很抱歉,但我会留下问题,以防其他人有同样的问题