关于使用Python子流程从SQL Server优化BCP导出的任何建议

关于使用Python子流程从SQL Server优化BCP导出的任何建议,python,sql,sql-server,bcp,sqlbulkcopy,Python,Sql,Sql Server,Bcp,Sqlbulkcopy,我正在学习BCP以导出大量数据(一次用于初始,并计划在日常工作中完成) 源数据位于SQL Server表中,由一些小表到大表(10M+行)组成。目标位于另一台计算机中(导出到文件) 目前,我正在使用python子流程实现它 通过使用没有指定batchsize的BCP命令(queryout,-U,-p,-S,-c)。 查询非常简单(SELECT FROM)。可能会在日常工作中添加WHERE日期 我尝试了100k数据,大约用了2分钟。然而,由于我的公司在开发环境中使用生产数据的限制,我还没有尝试使用

我正在学习BCP以导出大量数据(一次用于初始,并计划在日常工作中完成)

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

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

通过使用没有指定batchsize的
BCP
命令(
queryout,-U,-p,-S,-c
)。 查询非常简单(
SELECT FROM
)。可能会在日常工作中添加
WHERE
日期

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

有谁能建议一下,有没有什么方法可以优化
BCP
导出过程

我的理解是,它应该能够使它更好,因为我是以非常直接的方式做的


非常感谢。

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

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

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

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

“从db.dbo.mytable中选择*,其中键%10=0” 要获取十分之一的数据,请执行以下操作:

“从db.dbo.mytable中选择*,其中键%10=1” 获取下一个或另一个1/10的数据


在源服务器能够承受的时间内执行尽可能多的操作。这对于加快拷贝速度非常有用,但在加载到目标时要小心。你不能一起跑那么多。这可能是你在表现上最大的收获。获取尽可能多的BCP命令以运行源服务器。

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

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

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

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

“从db.dbo.mytable中选择*,其中键%10=0” 要获取十分之一的数据,请执行以下操作:

“从db.dbo.mytable中选择*,其中键%10=1” 获取下一个或另一个1/10的数据


在源服务器能够承受的时间内执行尽可能多的操作。这对于加快拷贝速度非常有用,但在加载到目标时要小心。你不能一起跑那么多。这可能是你在表现上最大的收获。让源服务器能够承受的BCP命令尽可能多地运行。

以前我必须解决大量数据的批量移动问题。虽然我没有python方面的经验。你能解释一下“子流程”是什么意思吗?这只是在主python脚本中创建的第二个shell或流程实例(执行bcp)?如果解决方案驻留在python中,我没有太多要补充的内容,但我可以提供有关BCP的好建议。@jamie我提到的子流程是python模块之一。它用于创建新流程。参考:我以前必须解决大量数据的批量移动问题。虽然我没有python方面的经验。你能解释一下“子流程”是什么意思吗?这只是在主python脚本中创建的第二个shell或流程实例(执行bcp)?如果解决方案驻留在python中,我没有太多要补充的内容,但我可以提供有关BCP的好建议。@jamie我提到的子流程是python模块之一。它用于创建新流程。非常感谢你的建议。我正在研究如何使用python对bcp执行线程。此外,我还试图找出我应该使用哪个“键”。目前,我的想法是使用条件is_unique=1和is_identity=1从sys表(即sys.index、sys.index_列、sys.columns、sys.tables)获取索引。但是,我可以得到所有具有这些索引的表的15%左右。你对如何选择好的索引有什么建议或经验吗?非常感谢你的建议。我正在研究如何使用python对bcp执行线程。肌萎缩侧索硬化