4 ответов:
у меня есть утилита импорта, сидящая на том же физическом сервере, что и мой экземпляр SQL Server. Использование пользовательского
IDataReader, он анализирует неструктурированные файлы и вставляет их в базу данных с помощьюSQLBulkCopy. Типичный файл имеет около 6 м квалифицированных строк, в среднем 5 столбцов десятичного и короткого текста, около 30 байт в строке.учитывая этот сценарий, я обнаружил, что размер пакета 5000 является лучшим компромиссом скорости и потребления памяти. Я начал с 500 и экспериментировал с большим. Я нашел 5000 чтобы быть в 2,5 раза быстрее, в среднем, чем 500. Вставка 6 миллионов строк занимает около 30 секунд при размере пакета 5000 и около 80 секунд при размере пакета 500.
10 000 не было заметно быстрее. Перемещение до 50 000 улучшило скорость на несколько процентных пунктов, но это не стоит увеличения нагрузки на сервер. Выше 50 000 не показали никаких улучшений в скорости.
это не формула, но это еще одна точка данных для вас, чтобы использовать.
Это вопрос, который я также потратил некоторое время на изучение. Я хочу оптимизировать импорт больших файлов CSV (16+ ГБ, 65+ миллионов записей и рост) в базу данных SQL Server 2005 с помощью консольного приложения C# (.Net 2.0). Как Джереми и уже указывал, вам нужно будет сделать некоторую тонкую настройку для ваших конкретных обстоятельств, но я бы рекомендовал вам иметь начальный размер партии 500 и тестовые значения как выше, так и ниже этого.
Я получил рекомендацию проверить значения между 100 и 1000 для размера партии от этого сообщение на форуме MSDN, и был настроен скептически. Но когда я протестировал размер партии от 100 до 10 000, я обнаружил, что 500 было оптимальным значением для моего приложения. Значение 500 для
SqlBulkCopy.BatchSizeТакже рекомендуем здесь.для дальнейшей оптимизации работы SqlBulkCopy, проверьте это совет MSDN; Я считаю, что с помощью SqlBulkCopyOptions.TableLock помогает сократить время загрузки.
как заявили другие, это зависит от вашей среды, в частности, от объема строки и задержки в сети.
лично я бы начал с установки
BatchSizeсвойство до 1000 строк и посмотреть, как это работает. Если это работает, то я продолжаю удваивать количество строк (например, до 2000, 4000 и т. д.) пока я не получу тайм-аут.В противном случае, если тайм-аут происходит на 1000, то я уменьшаю количество строк наполовину (например, 500), пока он не работает.
В каждом случае, я продолжаю удвоение (в случае успеха) или сокращение вдвое (в случае неудачи)разница между каждой из последних двух попыток размеров партии до тех пор, пока не найдете сладкое пятно.
другой фактор, чтобы рассмотреть, как долго это займет, чтобы скопировать a один пакета строк. Таймауты будут происходить, если пакет копируемых строк превышает
BulkCopyTimeoutсвойство, которое по умолчанию составляет 30 секунд. Вы можете попробовать удвоитьBulkCopyTimeoutсвойства до 60 секунд. Это позволяет дольше период времени для копирования большего набора строк пакета. Например, пакет из 50 000 строк может занять около 40 секунд, просто превышая 30-секундный лимит времени, так что натыкаясь на него до 60 секунд может помочь с производительностью.
все это зависит от вашей реализации.
какую скорость вы можете ожидать в своей сети? Вы используете его в формах или ASP.Net? Вам нужно предупредить пользователя о прогрессе? Каков размер общей работы?
по моему опыту, запуск массового копирования без указанного размера пакета вызовет проблемы с таймаутом. Мне нравится начинать с чего-то вроде 1000 записей и делать некоторые корректировки оттуда.
Comments