Sql-Server

通過連結伺服器插入到 SQL Azure 非常慢

  • February 21, 2014

我在 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

這就是我創建連結伺服器的方式:

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;

我已經檢查了這個主題Linked server to SQL Azure very slow但沒有任何建議對我有幫助。

本地 SQL-Server 的版本:Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 版權所有 (c) Microsoft Corporation Enterprise Edition (64-bit) o​​n Windows NT 6.1 (Build 7601) : Service Pack 1) (管理程序)

那麼,可能是什麼問題?

我在這個表中插入了大約 1000 行的少量數據,這需要 4 多分鐘

通過連結伺服器進行的遠端數據修改使用該sp_cursor模型。效果類似於發出 1000 個單獨的單個插入(每行一個)。如果一個往返需要 250 毫秒,那麼 1000 次這樣的行程將需要 4 分 10 秒。使用諸如bcpor的批量載入方法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;

構造的插入語句在 Azure 數據庫中執行,因此表使用本地名稱(注意:使用四部分目標名稱建構動態插入語句不會為您帶來任何好處)。

請注意,在連結伺服器選項中EXECUTE ... AT需要RPCRPC OUT啟用。

VALUES計劃語句的子句INSERT限制為 1000 個元素。有一些方法可以解決這個問題(VALUESCTE 中的子句沒有該限制)。您還可以選擇建構 1000 行批處理或建構單行插入語句,但如果定期有這麼多數據,您最好使用其中一種批量載入方法。

引用自:https://dba.stackexchange.com/questions/59328