2012-03-14 60 views
1

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

  1. 是否有任何API加载数据更快,然后SQL查询?我发现有一个本地导入API IRowsetFastLoad。但出口不幸。
  2. 是否有BCP本机格式的API?我找不到任何有关本地bcp文件格式的文档。
+0

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

回答

1

BOL

-n

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

数十亿行?那么你也将要使用:

的batch_size -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