通过链接服务器插入到 SQL Azure 非常慢

Igo*_*nko 4 sql-server linked-server azure-sql-database

我在 SQL Asure 服务器上有一个表,除了集群之外没有索引。我在这个表中插入了大约 1000 行的少量数据,这需要 4 多分钟。虽然,当我用 SSIS 做这件事时,它只需要一秒钟。这是查询:

INSERT INTO DatabaseName.dbo.tmpOurClients
(KodClient,Name ,ShortName,INN,Boss,contact,Email,Adres,Tel,City_ID,DateLop)
SELECT KodClient,Name ,ShortName,INN,Boss,contact,Email,Adres,Tel,City_ID,DateLop
FROM dbo.OurClients
Run Code Online (Sandbox Code Playgroud)

这就是我创建链接服务器的方式:

EXEC sp_addlinkedserver
@server='Azure',
@srvproduct='',
@provider='sqlncli',
@datasrc='ServerName.DATABASE.WINDOWS.NET',
@location='',
@provstr='',
@catalog='db_name'

EXEC sp_addlinkedsrvlogin
@rmtsrvname='Azure',
@useself='false',
@rmtuser='login@server_name.database.windows.net',
@rmtpassword='password'

EXEC sp_serveroption 'Azure', 'Collation Compatible', true;
Run Code Online (Sandbox Code Playgroud)

我已经检查了这个主题Linked server to SQL Azure 非常慢,但没有任何建议对我有帮助。

本地 SQL Server 版本:Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 2012 年 6 月 28 日 08:36:30 版权所有 (c) Microsoft Corporation Enterprise Edition(64 位),Windows NT 6.1(内部版本 7601) : Service Pack 1)(管理程序)

那么,可能是什么问题呢?

Pau*_*ite 7

我在这个表中插入了大约 1000 行的少量数据,这需要超过 4 分钟

通过链接服务器的远程数据修改使用该sp_cursor模型。效果类似于发出 1000 个单独的单个插入(每行一个)。如果往返需要 250 毫秒,那么 1000 次这样的旅行将需要 4 分 10 秒。使用诸如bcp或 之类的批量加载方法SSIS通常会更有效(除非要插入的行数很小)。

满足临时需求的另一种选择是构建一个字符串,该字符串包含INSERTVALUES子句中具有多行的单个语句。然后将该语句与 一起使用EXECUTE AT,例如:

-- Note local-to-azure table name used, not four-part syntax
DECLARE @sql varchar(max) = 'INSERT dbo.Test VALUES ';

-- Build a list of 1000 numbers to insert    
SELECT @sql += '(' + CONVERT(varchar(11), n) + '),'
FROM dbo.Numbers AS N
WHERE n BETWEEN 1 AND 1000;

-- Remove trailing comma
SET @sql = LEFT(@sql, LEN(@sql) - 1);

-- For debugging
PRINT @sql;

-- Execute the finished statement at the remote server;
EXECUTE (@sql) AT AZURE;
Run Code Online (Sandbox Code Playgroud)

构造的 insert 语句在 Azure 数据库中执行,因此表使用本地名称(注意:使用由四部分组成的目标名称构建动态 insert 语句没有任何好处)。

请注意,在链接服务器选项中EXECUTE ... AT需要RPCRPC OUT启用。

VALUES计划INSERT语句的子句限制为 1000 个元素。有办法解决这个问题(VALUESCTE 中的子句没有该限制)。您还可以选择构建 1000 行批处理或构建单行插入语句,但如果定期有这么多数据,您可能最好使用其中一种批量加载方法。