【问题标题】:How to increase bcp batch load?如何增加 bcp 批处理负载?
【发布时间】:2021-01-11 15:13:22
【问题描述】:

有没有办法增加发送到 sql server/sec 的行数?

我有超过 700 万条记录(1.5 GB 文件),从 bcp 文件将所有记录导入 sql server 表大约需要 30 分钟。

有没有办法将其增加到每次发送 10k 甚至 100000 行? 我遇到了一些 bcp 问题,直到最后我解决了它们,但每次我不得不调试这些问题时,我不得不等待半小时,这令人沮丧。此外,我们可能需要一遍又一遍地加载,因此了解未来 bcp 加载的更快方法会很有帮助。

这里有一些统计数据:

7217765 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 1765235 Average : (4088.84 rows per sec.)

bcp文件在网络驱动器上,表DDL如下:

CREATE TABLE [dbo].[Historical_Fact](
    [Style Code] [varchar](100) NULL,
    [Trim Code] [varchar](100) NULL,
    [Country] [varchar](100) NULL,
    [Org] [varchar](100) NULL,
    [Prod Code] [varchar](100) NULL,
    [Report Year] [varchar](100) NULL,
    [Scen] [varchar](100) NULL,
    [Volume] [decimal](25, 10) NULL,
    [EBIT] [decimal](25, 10) NULL,
    [NSR] [decimal](25, 10) NULL,
    [Measures] [varchar](100) NULL,
    [Values] [decimal](25, 10) NULL
) ON [PRIMARY]

【问题讨论】:

  • 嗯,为什么我被投了反对票?

标签: sql-server bcp


【解决方案1】:

来自docs:

-b 批量大小

指定每批导入数据的行数。每个批次都被导入并记录为一个单独的事务,在提交之前导入整个批次。默认情况下,数据文件中的所有行都作为一批导入。要在多个批次之间分配行,请指定一个小于数据文件中的行数的 batch_size。如果任何批次的事务失败,则仅回滚当前批次中的插入。已由已提交事务导入的批次不受后续故障的影响。

【讨论】:

  • 是的,我确实看过这个,但据我了解,默认情况下它是 1 批,但所有这个 -b 开关所做的只是将它们分成小批。但这对提高性能有何帮助?在我的情况下,理想的批量大小是多少?
  • 您特别询问了增加批量大小的问题。理想的批量大小可能超过 1000,但您应该进行测试。对于您的其他问题,请在原始问题中添加更多详细信息,包括文件在哪里,以及您正在加载的表 DDL。
  • @Cataster 请参阅docs 以获取建议
  • 哦,是的,有了 Tablock,性能肯定会得到巨大提升!
  • @Cataster 我没有对你的问题投反对票,但我会为你投赞成票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多