2014-04-09 44 views
1

我試圖將多個表從一臺機器上的Sybase IQ數據庫傳輸到另一臺計算機上的相同數據庫(完全相同的模式和表格佈局等)。在Sybase IQ中使用「從位置插入」語句傳輸表非常慢

要做到這一點我使用的刀片從位置聲明:

insert into <local table> location <other machine> select * from mytablex 

這工作得很好,但問題是,它是拼命緩慢。我在兩臺機器之間都有1千兆的連接,但傳輸速率遠不及此。

使用1千兆字節的測試文件,只需1或2分鐘即可通過ftp傳輸(就像文件一樣,與IQ無關)。 但是我只能在IQ中24小時內管理100千兆字節。這意味着對於通過Sybase IQ傳輸的數據,傳輸速率對於1千兆字節更像是14或15分鐘。

有什麼辦法可以加快速度嗎?

我看到有一個選項可以改變數據包的大小,但這會有所作爲嗎?當然,如果文件的傳輸速度比文件快7倍,那麼數據包的大小不能成爲那麼重要的因素?

謝謝! :)

+0

你能指定你使用的是哪個IQ版本嗎? –

+0

嗨,這是智商15.2 – user2533268

回答

2

從文檔herehere看來,使用insert into是逐行操作,而不是批量操作。這可以解釋您所看到的性能問題。

您可能需要查看批量加載LOAD TABLE操作。

+1

謝謝,我在IQ最佳實踐指南中查看此建議:[鏈接](http://www.sybase.com/files/White_Papers/SybaseIQ15_best_practices_wp20110718.pdf)「執行INSERT ... LOCATION操作,如果數據量較大(大多數平臺上的默認值爲512字節),則將通信數據包大小增加至4K,如果數據量大(在大多數平臺上缺省爲512字節):INSERT LOCATION PACKETSIZE 4096.驗證 遠程ASE(sp_configure缺省包大小/最大包大小) /或IQ(-p服務器選項)可以處理此包裝大小。「這意味着你可以實際使用它進行大數據傳輸,但不是100%肯定的。 – user2533268

+1

我認爲導出和LOAD TABLE操作是解決這個問題的方法。非常感謝您的投入 - 也是酒店。 – user2533268

2

如果我記得正確的話,IQ 15.x已經知道錯誤,其中包的大小被有效地忽略,因爲insert ... location ... select和默認的512總是被使用。

insert ... location ... select通常是批量tds操作,但是我們發現它在處理千兆字節數據時具有有限的值,並且構建了一個進程來處理顯着的提取/加載表更快。

我知道這不是您想要的答案,但隨着數據量的增長,性能似乎會降低。如果足夠大,一些表格實際上永遠不會完成。

只是一個想法,你可能想要指定確切的列,並用exec動態sql包裝。動態SQL是否定的,但是如果你需要dev/qa + prod環境中的proc可執行文件,那實在沒有別的選擇。我假設這將在一個受控的環境中調用,但這裏是我的意思:

declare @cmd varchar(2500), @location varchar(255) 

set @location = 'SOMEDEVHOST.database_name' 

set @cmd = 'insert localtablename (col1, col2, coln...) ' + 
       ''''+ trim(@location)+ '''' + 
       ' { select col1, col2, coln... from remotetablename}' 

select @cmd 

execute(@cmd) 
go 
+0

謝謝!這實際上非常有用。如果插入位置的性能降低,則可能無法這樣做。你有沒有發現你寫的過程更快?你獲得了多少性能提升? – user2533268

+0

好吧,它比沒有完成的速度更快,更可靠。我真的說這取決於你是否轉向使用LOAD TABLE的要求。就你而言,這聽起來像你正在移動100 + GB的數據......我建議不要這樣做與插入...位置...選擇功能。從事務日誌的角度來看,這對數據庫造成了很大的壓力。我假設你正在對某些行數進行批處理?無論如何,我認爲這個卷正確的方法是解壓縮到一個文件,並在目的地上使用LOAD TABLE命令。 – Hotel