【问题标题】:Fast dump SQL Server Table快速转储 SQL Server 表
【发布时间】:2012-03-14 23:00:43
【问题描述】:

我在 SQL Server 2008 R2 中有一个大表。它包含数十亿行。我需要在我们的应用程序中加载整个数据集。查询整个表很慢。我想使用 bcp 将其转储到文件中并加载。但问题是存在字符串列,它包含各种特殊字符,如'\t'、'\0'、逗号和'\n'。我找不到好的字段/行终止符。但是长字符串终止符会减慢我的应用程序的数据文件加载速度。问题是:

  1. 有没有比 SQL 查询加载数据更快的 API?我发现有一个本地导入 API IRowsetFastLoad。但出口不走运。
  2. 是否有任何用于 BCP 原生格式的 API?我找不到任何关于原生 bcp 文件格式的文档。

【问题讨论】:

  • 你的数据流有点不清楚,你把数据加载到你的应用程序是什么意思?您将从 SQL Server 导出到平面文件,然后将该平面文件加载到您的应用程序中是否正确?它会将数据加载到内存中,还是将其作为流从文件中处理?从 SQL Server 导出数据或将其加载到应用程序中是否存在性能问题?

标签: sql-server bcp


【解决方案1】:

来自BOL

-n

使用数据的本机(数据库)数据类型执行大容量复制操作。此选项不提示每个字段;它使用原生值。

数十亿行?然后你也会想要使用:

-b 批量大小

指定每批数据复制的行数。每个批次都作为一个事务复制到服务器。 SQL Server 在失败的情况下提交或回滚每个批次的事务。

您不能同时访问这两个数据库,或许通过链接服务器?这会让事情变得更容易。

DECLARE @StartId BIGINT
DECLARE @NmbrOfRecords BIGINT
DECLARE @RowCount BIGINT

SET @StartId = 0
SET @NmbrOfRecords = 9999
SET @RowCount = 1

WHILE @RowCount > 0
BEGIN
  BEGIN TRANSACTION

  INSERT INTO DestinationDatabase.dbo.Mytable
  SELECT * FROM SourceDatabase.dbo.Mytable
  WHERE ID BETWEEN @StartId AND @StartId + @NmbrOfRecords

  SET @RowCount = @@ROWCOUNT

  SET @StartId = @StartId + @NmbrOfRecords + 1

  COMMIT TRANSACTION
END

【讨论】:

    【解决方案2】:

    批量插入 API 由 SqlBulkCopy 类向程序员公开:

    http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

    【讨论】:

    • 根据您链接到的文档,这是为了“有效地使用来自另一个来源的数据批量加载 SQL Server 表”,但 OP 想要做的恰恰相反。
    【解决方案3】:

    使用 bcp 实用程序 (SQL Server) 导入和导出批量数据

    http://technet.microsoft.com/en-us/library/aa337544.aspx

    批量复制函数参考:

    http://technet.microsoft.com/en-us/library/ms130922.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多