批量复制 - sybase

时间:2010-10-31 15:31:24

标签: database sybase sqlbulkcopy

我需要有选择地(行和列)从一个表到另一个表导出大约2000万行。这就是我试过的:

--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中的选择性列和行以及表2中的bcp。有没有可以使用的替代快速方法?如果可以做到,我会很高兴&lt; 4个小时。

感谢您阅读。

1 个答案:

答案 0 :(得分:1)

我认为你的意思是:

WHERE PK > start_value AND PK < end_value

没有充分的理由在同一台服务器上的两个表中复制数据,因此希望这些表位于不同的服务器上。如果您正在“存档”,那么请注意,这是错误的做法;相反,提高表速度。请参阅this post

  1. INSERT-SELECT将终止事务日志,事务日志会逐渐变慢,并阻止其他用户使用db。如果你分成1000行的批次,它会更快,更善于交际。
  2. 如果可以做到,我会很高兴&lt; <4小时

    1. 应该没问题。取决于您的硬件和磁盘布局。我可以在运行ASE 15.5的小型演示盒上以13.2秒的速度加载1600万行。

    2. bcp会自动运行两种模式,具体取决于以下条件:

      • FAST。这需要设置SELECT_INTO / BULK_COPY sp_dboption,这允许bcp不记录INSERTS,只允许分配。还需要删除表上的索引(可以在bcp完成后创建它们)。

      • SLOW。上述任何一种情况都未得到满足。记录所有INSERTS。确保转储日志的阈值(它将填充)。

    3. out_data_file或Table_2都不是Table_1的列的子集。在Table_1服务器上创建Table_2的视图。 Bcp-out视图。您还可以在视图中放置WHERE子句,进行转换等。

    4. 您可以并行执行bcp(最多为主机系统上的CPU /内核)。将提取物分成不平行的流(例如,在8核机器上,exec 8并行提取作业)。使用-F和-L参数指定Table_1的八分之一。使用“&amp;”如果你有o / s和8 x BAT文件,如果你没有。

    5. 您还可以并行运行(例如)8个INSERT-SELECT作业。按PK值拆分,而不是行号。