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 秒。没有返回结果,不可能是网络问题,为什么要这么长时间?
好的,这就是我认为你需要做的。我假设您已经在使用集成服务,因此您已经设置了两个数据源,因此我不会详细介绍。如果您对如何正确设置这些有任何疑问,我可以帮助您。因此,您需要做的第一件事是在您的集成服务解决方案中创建一个新包。然后你需要创建一个数据流任务。你会在你的工具箱中找到它,就像这样。

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

打开并设置您的 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 命令和适当的值以执行您的存储过程。

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

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