远程查询和链接服务器

Sea*_*anW 4 sql-server linked-server

我有 2 台装有 SQL Server 2008 R2 的服务器:INT& CRM

我需要在 上运行一个 SSIS 包INT,它使用来自INT数据库和CRM数据库的数据。慢得令人痛苦。

我试过这个来测试一个简单的查询(上INT):

EXEC sp_addlinkedserver @server='CRM', 
                        @srvproduct='', 
                        @provider='SQLNCLI', 
                        @datasrc='<IP of CRM>'

EXEC sp_addlinkedsrvlogin
                        @useself='FALSE',
                        @rmtsrvname='CRM',
                        @rmtuser='<username>',
                        @rmtpassword='<userpassword>'
Run Code Online (Sandbox Code Playgroud)

我还在服务器<username>上赋予了ddl_admin 角色CRM,如此答案中所建议的: 跨链接服务器远程查询的 SQL 性能问题

然后我运行这个查询:

UPDATE [CRM].DB.dbo.table1
SET field = 1
WHERE id = (SELECT id FROM [CRM].DB.dbo.table2 WHERE secondary_id = 9999)
Run Code Online (Sandbox Code Playgroud)

此查询在CRM自身运行时需要 40 毫秒才能运行。在上面的例子中运行需要 30 秒。没有返回结果,不可能是网络问题,为什么要这么长时间?

Zan*_*ane 5

好的,这就是我认为你需要做的。我假设您已经在使用集成服务,因此您已经设置了两个数据源,因此我不会详细介绍。如果您对如何正确设置这些有任何疑问,我可以帮助您。因此,您需要做的第一件事是在您的集成服务解决方案中创建一个新包。然后你需要创建一个数据流任务。你会在你的工具箱中找到它,就像这样。

数据流任务

完成后,打开 DataFlowTask 并创建一个新的 OLEDB 连接。再次在工具箱中找到。 OLE连接

打开并设置您的 SQL 命令,这将在机器本地运行,因此不会产生链接查询成本。 源选择 接下来设置您的 OLEDB 命令,该部分将使用结果集执行 SQL 命令。首先从工具箱中选择 OLEDB 命令。 在此处输入图片说明

将您的 OLE 连接连接到您的 OLE 命令。 在此处输入图片说明

接下来,您将创建一个存储过程来处理此更新。这是一个相当简单的过程,使它最终看起来像这样。

CREATE PROCEDURE UPD_CRM_TableName(
    @ID int,
    @Field int)

UPDATE TableName SET 
@Field = Field

WHERE @ID = ID
Run Code Online (Sandbox Code Playgroud)

然后打开您的 OLEDB 命令并在连接选项卡中选择适当的连接。 在此处输入图片说明

转到组件属性选项卡,单击 SQL 命令和适当的值以执行您的存储过程。

在此处输入图片说明

然后转到列映射并使您的参数与您的列匹配,您将很好地执行包。请注意,更新存储过程将使用更新表所需的适当参数发送到服务器,从而无需进行昂贵的链接查询。

在此处输入图片说明

为您命令的任何更新设置此设置将非常容易设置,并且基本上会以您的硬件和网络可以跟上的速度运行。确保您的集成服务盒有足够的内存,因为所有操作都在那里执行。如果您有任何问题,请随时告诉我。