在SQL Server中并行导入数据

时间:2016-11-22 16:06:26

标签: sql-server parallel-processing bulkinsert sqlbulkcopy bulk-load

我有超过100个文件要导入到sql server中,其中大多数都是500 MB。我想利用SQL Server的并行导入实用程序,并阅读了许多网页,如下所示:

如何在30分钟内加载1 TB数据

https://technet.microsoft.com/en-us/library/dd537533(v=sql.100).aspx

与表级锁定并行导入数据

https://technet.microsoft.com/en-us/library/ms186341(v=sql.105).aspx

控制批量导入的锁定行为

https://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx

和stackoverflow中的答案

Fastest way to insert in parallel to a single table

然而,他们都没有给出一个简单的代码示例。我知道如何使用批量插入/ bcp,但我不知道从哪里开始并行导入?任何人都可以帮我吗?

我的系统是Windows,我使用的是SQL Server 2016.源数据文件采用txt格式。

提前感谢您的帮助!

杰森

1 个答案:

答案 0 :(得分:3)

  1. 将文件路径详细信息加载到跟踪表

    创建表FileListCollection TABLE(Id int identity(1,1),filepath VARCHAR(500),ThreadNo tinyint,isLoaded int)

    DECLARE @FileListCollection TABLE(filepath VARCHAR(500)) DECLARE @folderpath NVARCHAR(500) DECLARE @cmd NVARCHAR(100) SET @folderpath ='' SET @cmd =' dir' + @folderpath +' / b / s'

    INSERT INTO @FileListCollection EXECUTE xp_cmdshell @cmd

    DELETE FROM @FileListCollection WHERE filepath IS NULL

    插入FileListCollection(filepath,isLoaded) 选择文件路径,0 来自@FileListCollection

  2. 每个帖子的时间表

    声明@ThreadNo int = 3 更新f set ThreadNo =(id%@ ThreadNo) 来自FileListCollection f

  3. 打开三个会话并为每个

  4. 分配线程编号
  5. 运行以下脚本加载数据

    DECLARE @filepath NVARCHAR(500) DECLARE @filepath NVARCHAR(500) DECLARE @bcpquery NVARCHAR(MAX); DECLARE @ThreadNo int = 1 什么时候存在(         选择TOP 1 *         FROM FileListCollection         其中ThreadNo = @ThreadNo         并且isLoaded = 0         ) 开始     SELECT TOP 1 @filepath = filepath     FROM FileListCollection     其中ThreadNo = @ThreadNo         并且isLoaded = 0

    SET @bcpquery = 'bulk insert <Database>.dbo.Table from '''+ @filepath+''' with (fieldterminator = ''|'', rowterminator = ''\n'')';
    
    print @bcpquery
    --Load the Content in table
    execute sp_executesql @bcpquery;
    
    Update FileListCollection set isLoaded = 1
    WHERE filepath = @filepath
    

    END