2013-06-10 6 views
4

Я вставляю около 7 миллионов строк в таблицу на SQL Server. Таблица имеет около 9-10 столбцов и имеет clustered index на 2 ключах (столбцах) и еще 3 unclustered indexes.. Я пытаюсь сделать высокопроизводительную/объемную вставку данных, но она становится довольно медленной после вставки 3 миллионов записей с дискового использования до 99%. Вот что я сделал для ускорения этого процесса:Вставка данных высокой производительности в SQL Server

1) Отключил все некластерные индексы. Я не отключил 2-х столбчатый кластерный индекс, потому что данные не могут быть вставлены после отключения кластерного индекса?

2) Я использую C# SqlBulkCopy, чтобы делать объемную вставку из 5000 записей каждый раз.

3) В таблице не имеют каких-либо ограничений и триггеров

Что я должен делать, чтобы ускорить этот процесс вставки данных?

+1

http://stackoverflow.com/q/24200/139010 и http://stackoverflow.com/a/2457862/139010 –

+1

Закажите данные для вставки таким образом, чтобы они были в порядке кластеризованного индекса. – spender

+0

Я не буду опускать ни одного из небрежных комментариев «переключиться на простое восстановление», но сделайте это, только если вы ДЕЙСТВИТЕЛЬНО знаете, что делаете. В противном случае пренебрегайте такими предложениями. – OzrenTkalcecKrznaric

ответ

2

Избавьтесь от ВСЕХ ваших указателей. Каждый раз, когда вы пишете с индексом, физическая страница должна быть переструктурирована при записи каждой записи. Сбросьте все свои индексы с помощью кода (DROP INDEX), вставьте свои данные и затем заново создайте свои индексы с помощью кода (CREATE INDEX).

1

Убедитесь, что база данных находится в режиме восстановления BULK LOGGED или SIMPLE, по крайней мере, до тех пор, пока не будут вставлены все записи. Это приведет к сбою файла журнала транзакций.

+1

Не предлагайте такое действие без тщательного расследования! Из-за этого кто-то может потерять свою работу. – OzrenTkalcecKrznaric

+0

Избавление от индексов, принятый ответ, одинаково, если не более опасно, чем _temporarily_ изменение режима восстановления, чтобы сделать большую вставку. –

1

Как сказал источник, ваш индекс кластера может быть проблемой. Вы можете вставлять данные таким образом, чтобы ваш индекс кластера не сортировался. Поэтому SQL-сервер должен создавать множество страниц с одной записью и делать оптимизацию, как только он увидит много редко заполненных пакетов. Попробуйте использовать автоматически сгенерированные индексы int. Если вы не можете этого сделать, отсортируйте все объемные данные (на основе кластерного столбца индекса - порядок важен), прежде чем вставлять их в SQL. Это должно минимизировать использование диска.

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