2010-10-31 77 views
2

我需要選擇性地(行和列)從一個表格導出約2000萬行到另一個表格。這是我試過的:批量複製 - sybase

--Run this in batch: 
INSERT INTO Table 2 
Select A, B from Table1 
where A > a and B < b 

---Table1 have columns A, B....Z and got around 50 million records. 

完成大約需要12個小時。我不認爲sybase允許bcp輸出來自Table1的選擇性列和行以及bcp輸入到Table2中。有沒有其他可以使用的快速方法?我會很高興,如果它可以完成4小時<。

感謝您的閱讀。

回答

1

我想你的意思:

WHERE PK > start_value AND PK < end_value 

沒有充分的理由重複在同一服務器上的兩個表的數據,所以希望這些表是單獨的服務器上。如果你「歸檔」,那麼應該被告知,這是錯誤的做法;反而提高桌子的速度。請參閱this post

  1. INSERT-SELECT將終止事務日誌,事務日誌會逐漸變慢,並阻止其他用戶使用該數據庫。如果你分成1000行的批次,它會更快,更有社交性。

我很高興,如果這是可以做到<4小時

  • 應該是沒有問題的。取決於您的硬件和磁盤佈局。我可以在運行ASE 15.5的小演示盒上在13.2秒內裝載1600萬行。

  • BCP在兩種模式下運行時,自動地,根據條件的不同,如下所示:

    • FAST。這需要設置SELECT_INTO/BULK_COPY sp_dboption,它允許bcp不記錄INSERTS,只記錄Allocations。還需要刪除表中的索引(它們可以在bcp完成後創建)。

    • SLOW。上述任一條件都不符合。所有插入記錄。確保在日誌中有一個臨界值(它將填充)。

  • 對於out_data_file或Table_2成爲Table_1的列的子集,完全沒有問題。在Table_1服務器上創建Table_2的視圖。刪除視圖。您也可以在視圖中放置WHERE子句,執行轉換等。

  • 您可以並行執行bcp(直到您主機系統上的CPU /內核數爲止)。將提取分割爲並行流(例如,在8核心機器上,exec 8並行提取作業)。使用-F和-L參數來指定Table_1的八分之一。如果您沒有o/s和8 x BAT文件,請使用「&」。

  • 您也可以並行運行(例如)8個INSERT-SELECT作業。按PK值拆分,而不是行號。