使用 Python 子进程从 SQL 服务器优化 BCP 导出的任何建议

Any suggestion for optimizing BCP export from SQL Server using Python Subprocess

我正在研究 BCP 以导出大量数据(初始一次,并计划在日常工作中进行)。

源数据位于 SQL 服务器表中,这些表由一些小表到大表(超过 1000 万行)组成。目的地在另一台机器上(导出到文件)。

目前,我正在使用 python 子流程来实现它。

通过使用 BCP 命令而不指定批大小 (queryout, -U, -P, -S, -c)。 而且查询非常简单 (SELECT <column_names> FROM <table_name>)。也许在日常工作中添加 WHERE 个日期。

我试过 100k 数据,大约需要 2 分钟。但是,由于我公司限制在开发环境中使用生产数据,因此我没有尝试使用 10M+ 数据。此外,我无法将任何数据插入源 SQL 服务器(仅限读取权限)。

任何人都可以建议有什么方法可以优化 BCP 导出过程吗?

我的理解是应该可以做得更好,因为我做的很直接

非常感谢。

如果您将数据从一个 SQL 服务器移动到另一个 MS SQL 服务器,然后使用 -N 选项以原始格式将数据复制到您的文件将有助于减少转换数据的时间类型到文本。

使用-a 选项指定网络数据包大小。我不能在这里建议一个合适的值,因为这将取决于你的网络(文件是从服务器分发到磁盘吗?如果是这样,那么在这里尝试一些不同的值......如果不是,请不要打扰......不涉及网络)。

将数据导入目标时使用 -b 选项。我不能在这里建议一个合适的值,因为这将取决于您的系统架构,但是在测试中使用这个值来获得一个精确的值。这不适用于导出。

导出大型 table 时,将副本分到多个文件中。希望你的大 tables 有一个数字键或一些具有高选择性的数值。该值可用于将数据划分为 10 或 100 个线程。这将允许您从同一个 table 中同时执行多个 bcp 命令。使用 "queryout" 选项和如下命令:

"select * from db.dbo.mytable where key % 10 = 0" 获取 1/10 的数据并:

"select * from db.dbo.mytable where key % 10 = 1" 获取下一个或另一个 1/10 的数据。

同时执行尽可能多的你的源服务器可以承受。这对于加快复制速度非常有用,但在加载到目的地时要小心。你将无法 运行 一起。这可能是您在性能方面的最大收获。获取源服务器可以承受的尽可能多的 BCP 命令 运行ning。