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)(管理程序)
那么,可能是什么问题呢?
我在这个表中插入了大约 1000 行的少量数据,这需要超过 4 分钟
通过链接服务器的远程数据修改使用该sp_cursor
模型。效果类似于发出 1000 个单独的单个插入(每行一个)。如果往返需要 250 毫秒,那么 1000 次这样的旅行将需要 4 分 10 秒。使用诸如bcp
或 之类的批量加载方法SSIS
通常会更有效(除非要插入的行数很小)。
满足临时需求的另一种选择是构建一个字符串,该字符串包含INSERT
在VALUES
子句中具有多行的单个语句。然后将该语句与 一起使用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
需要RPC
和RPC OUT
启用。
VALUES
计划INSERT
语句的子句限制为 1000 个元素。有办法解决这个问题(VALUES
CTE 中的子句没有该限制)。您还可以选择构建 1000 行批处理或构建单行插入语句,但如果定期有这么多数据,您可能最好使用其中一种批量加载方法。