У меня есть более 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-сервер 2016. Файл исходных данных находится в формате txt.
Заранее спасибо за вашу помощь!
Джейсон
Загрузите данные о пути файла в таблицу отслеживания
Создать таблицу FileListCollection TABLE (идентификатор идентификатора (1,1), путь к файлу VARCHAR (500), ThreadNo tinyint, isLoaded int)
DECLARE @FileListCollection TABLE (путь к файлу 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
УДАЛИТЬ ИЗ @FileListCollection WHERE путь к файлу NULL
вставить в FileListCollection (путь к файлу, isLoaded) выбрать путь к файлу, 0 из @FileListCollection
Расписание для каждой темы
объявить @ThreadNo int = 3 update f установить ThreadNo = (id% @ ThreadNo) из FileListCollection f
Откройте три сеанса и назначьте номер потока каждому
Запустите приведенный ниже сценарий для загрузки данных
DECLARE @filepath NVARCHAR (500) DECLARE @filepath NVARCHAR (500) DECLARE @bcpquery NVARCHAR (MAX); DECLARE @ThreadNo int = 1 WHILE EXISTS (SELECT TOP 1 * FROM FileListCollection где ThreadNo = @ThreadNo и isLoaded = 0) BEGIN SELECT TOP 1 @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
КОНЕЦ