通過連結伺服器插入到 SQL Azure 非常慢
我在 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) on Windows NT 6.1 (Build 7601) : Service Pack 1) (管理程序)
那麼,可能是什麼問題?
我在這個表中插入了大約 1000 行的少量數據,這需要 4 多分鐘
通過連結伺服器進行的遠端數據修改使用該
sp_cursor
模型。效果類似於發出 1000 個單獨的單個插入(每行一個)。如果一個往返需要 250 毫秒,那麼 1000 次這樣的行程將需要 4 分 10 秒。使用諸如bcp
or的批量載入方法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
需要RPC
並RPC OUT
啟用。
VALUES
計劃語句的子句INSERT
限制為 1000 個元素。有一些方法可以解決這個問題(VALUES
CTE 中的子句沒有該限制)。您還可以選擇建構 1000 行批處理或建構單行插入語句,但如果定期有這麼多數據,您最好使用其中一種批量載入方法。