2014-05-23 4 views
0

У меня проблема с импортом данных powershell в SQL. Я выполняю импорт CSV-файлов, размещенных на удаленном сервере, на другой сервер БД. Существует около 2400 CSV-файлов, размер которых варьируется от 1 КБ до 30 ГБ. Я читаю содержимое каждого файла и импортирую его в базу данных. Но для завершения около тысячи файлов требуется больше одного дня, поэтому для завершения всех 2400 файлов будут приняты два или три. Но это не согласовано для бизнеса. Я использую следующую команду для импорта файлов.производительность импорта данных powershell

Get-ChildItem $CsvFilePath | Foreach-Object { 
    $DataImport = Import-Csv $_.FullName | Out-DataTable 
    Write-DataTable -ServerInstance $server -Database $Database -TableName $Table -Username $Username -Password $Password -Data $DataImport 
} 

Как повысить производительность, чтобы я мог завершить импорт в течение короткого периода времени, предпочтительно, менее чем за день. Любой, пожалуйста, помогите мне, предоставив для этого практическое решение.

Благодаря Jerin

+0

Все они загружаются в одну и ту же БД? – mjolinor

ответ

0

Если сервер имеет более чем 1 ядро, вы должны использовать -AsJob параметр или Start-Job командлета, чтобы начать однопоточный импорт одного CSV в то время, и ваш мастер сценарий должен контролировать количество выполняемых заданий, делая больше рабочих мест из списка ваших CSV-файлов, если выполняется меньшее количество заданий «количество ядер на сервере -1». Количество ядер лучше всего жестко закодировано, так как вы, по-видимому, строгие в промежутках времени для разработки сценария импорта.

И будет лучше, если вы перенесите все CSV на локальное хранилище заранее. Если вы не можете, все в порядке, но процесс импорта может замедляться из-за ограничения пропускной способности и ограничения скорости хранения, установленных на существующих лимитах вашего сервера.

Some data about Powershell jobs to digest.

+0

HI Vesper, не могли бы вы рассказать немного больше о своей первой точке. Я не могу следовать за вами – user3480406

+0

Вы импортируете задание, это означает, что отдельный процесс 'powershell.exe' запускает скрипт и один файл, который выходит после завершения импорта. По умолчанию Powershell использует один процесс (одна операция сразу), поэтому весь импорт последователен, я рекомендую вам использовать более одного потока для работы с более чем одним файлом за раз. Это уменьшает время, затрачиваемое на импорт. – Vesper

+0

У меня есть ур, как будто вы советуете мне использовать асинхронный звонок? – user3480406

0

Не уверен, что ваш дистрибутив размер, но 1KB - 30GB довольно широкий ассортимент. После того, как вы начнете получать более нескольких сотен МБ, я подозреваю, что управление памятью может добавить много издержек процесса и создать перетаскивание производительности.

Возможно, вы захотите перейти на процесс Get-Content с -ReadCount, который разбивает их на управляемые куски для импорта.

Смежные вопросы