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

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

我有一个使用存储过程构建的框架,可以将 OLTP 中的数据 1 对 1 移动到 BI 暂存区域。它是通用的,只需告诉它 OLTP 中的哪个表,它就会构建 sql 来移动它。

问题是,它是为了使用 OLTP 服务器的链接服务器而构建的。 现在,OLTP 开始将 CLR 类型列(例如地理)添加到表中,这些列无法通过链接服务器收集。

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

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

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

OPENROWSET('SQLNCLI', 'Server=我的服务器;Trusted_Connection=yes;' 选择 ...)

速度与链接服务器相同,但 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

彼得

最佳答案

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

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

抱歉,但我会留下这个问题,以防其他人遇到同样的问题

关于sql-server - 链接服务器的替代方案,具有相同的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49487079/

相关文章:

sql-server - 使用 BULK INSERT 命令将 CSV 文件导入 SQL Server 表

sql-server - 将数据库表从一个 SQL Server 数据库表更新到另一个?

mysql - 使用存储过程将用户添加到数据库

c# - 在 web.config 中指定链接的 sql server

sql-server-2014 - SQL Server 链接服务器查询返回空行

oracle11g - 使用四部分名称访问 Oracle DB 作为 SQL Server 链接服务器时出现无效的列定义错误

java - 将 jtextbox 值和 jradiobutton 值插入数据库

sql - 如何引用第二个 SQL Server

c# - 将 INT 传递给存储过程失败

mysql - 为MySQL存储过程添加默认值为NULL的参数