2012-03-14 61 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