Параллельный импорт данных в SQL Server

У меня есть более 100 файлов для импорта на сервер sql, и большинство из них имеют размер 500 МБ. Я хочу использовать утилиту параллельного импорта SQL-сервера и прочитал несколько веб-страниц, например следующие:

Как загрузить 1 ТБ данных за 30 минут

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

Самый быстрый способ вставки параллельно в одну таблицу

Однако ни один из них не привел простого примера с кодом. Я знаю, как использовать массовую вставку/bcp, но не знаю, с чего начать параллельный импорт? Может ли кто-нибудь помочь мне с этим?

Моя система — Windows, и я использую SQL Server 2016. Файл исходных данных имеет формат txt.

Заранее спасибо за вашу помощь!

Джейсон


person Jason    schedule 22.11.2016    source источник


Ответы (1)


  1. Загрузите сведения о пути к файлу в таблицу отслеживания

    Create table 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 = '<FolderPath>' 
    SET @cmd = 'dir ' + @folderpath + ' /b /s'
    
    INSERT INTO @FileListCollection
    EXECUTE xp_cmdshell @cmd
    
    DELETE
    FROM @FileListCollection
    WHERE filepath IS NULL
    
    insert into FileListCollection(filepath, isLoaded)
    select filepath, 0
    from @FileListCollection
    
  2. Расписание для каждого потока

    declare @ThreadNo int = 3
    update f set ThreadNo=(id%@ThreadNo)
    from FileListCollection f 
    
  3. Откройте три сеанса и назначьте номер потока каждому

  4. Запустите приведенный ниже скрипт, чтобы загрузить данные

    DECLARE @filepath NVARCHAR(500)
    DECLARE @filepath NVARCHAR(500)
    DECLARE @bcpquery NVARCHAR(MAX);
    DECLARE @ThreadNo int = 1
    WHILE EXISTS (
            SELECT TOP 1 *
            FROM FileListCollection
            where ThreadNo = @ThreadNo
            and isLoaded = 0
            )
    BEGIN
        SELECT TOP 1 @filepath = filepath
        FROM FileListCollection
        where ThreadNo = @ThreadNo
            and 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
    
person Syed    schedule 22.11.2016
comment
Спасибо за ответ! Я проверю это. - person Jason; 22.11.2016
comment
Приведенная выше логика кода поможет при параллельном импорте повысить производительность при одновременном использовании. Блокировка таблицы в команде bcp, как указано в вашем вопросе. - person Syed; 22.11.2016