2

我需要有选择地(行和列)将大约 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 out 与Table1 中的选择性列和行以及bcp in 到Table2。是否有可以使用的替代快速方法?如果能在 4 小时内完成,我会很高兴。

感谢您阅读。

4

1 回答 1

1

我想你的意思是:

WHERE PK > start_value AND PK < end_value

没有充分的理由在同一服务器上的两个表中复制数据,因此希望这些表位于不同的服务器上。如果您正在“归档”,那么请注意,这是错误的做法;而是提高桌面速度。参考这篇文章

  1. 该 INSERT-SELECT 将终止事务日志,这将使您的运行速度逐渐变慢,并阻止其他用户使用数据库。如果你分成 1000 行的批次,它会更快,更善于交际。

如果能在 4 小时内完成,我会很高兴

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

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

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

    • 慢的。不满足以上条件之一。记录所有 INSERTS。确保您在转储它的日志上有一个阈值(它将填充)。

  3. out_data_file 或 Table_2 作为 Table_1 列的子集完全没有问题。在 Table_1 服务器上创建 Table_2 的视图。Bcp-out 视图。您还可以在视图中放置 WHERE 子句,进行转换等。

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

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

于 2010-11-01T10:05:14.877 回答