【问题标题】:Any suggestion for optimizing BCP export from SQL Server using Python Subprocess使用 Python Subprocess 从 SQL Server 优化 BCP 导出的任何建议
【发布时间】:2020-05-20 22:47:29
【问题描述】:

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

源数据位于 SQL Server 表中,由一些小表到较大的表(10M+ 行)组成。目标在另一台机器上(导出到文件)。

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

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

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

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

我的理解是它应该能够让它变得更好,因为我以非常直接的方式做到了。

非常感谢。

【问题讨论】:

  • 我之前不得不解决大量数据的批量移动问题。虽然我没有使用 python 的经验。您能解释一下“子流程”是什么意思吗?这只是在主 python 脚本中创建的第二个 shell 或流程实例(执行 bcp)吗?如果解决方案位于 python 中,我不会有太多补充,但我可以提供关于 BCP 的好建议。
  • @jamie 我提到的子进程是 python 的模块之一。它用于创建新流程。参考:docs.python.org/3/library/subprocess.html

标签: python sql sql-server bcp sqlbulkcopy


【解决方案1】:

如果您要将数据从一个 SQL Server 移动到另一个 MS SQL Server,则使用 -N 选项以本机格式将数据复制到您的文件将有助于减少将数据类型转换为文本的时间。

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

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

导出大表时,将副本导出到多个文件。希望您的大表有一个数字键或一些具有高选择性的数值。该值可用于将数据划分为 10 或 100 个线程。这将允许您从同一个表中同时执行多个 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 命令。

【讨论】:

  • 非常感谢您的建议。我正在研究如何使用 python 线程化 bcp。另外,我想弄清楚我应该使用哪个“钥匙”。目前,我的想法是使用条件 is_unique = 1 和 is_identity = 1 从 sys 表(即 sys.indexes、sys.index_columns、sys.columns、sys.tables 一起)中获取索引。但是,我可以得到大约 15具有这些索引的所有表的百分比。您对如何选择好的索引有什么建议或过去的经验吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2013-10-09
  • 2016-10-29
  • 2015-02-02
  • 1970-01-01
相关资源
最近更新 更多