Скорость вставки таблицы замедляется, размер таблицы увеличивается - PullRequest
2 голосов
/ 16 февраля 2012

Анализ некоторых данных и вставка их в 3 таблицы из .NET. Использование табличных параметров для передачи данных, так как некоторые вставки имеют 600 000 строк. Передача объектов (не DataTables), и они передаются по ссылке (природа TVP). Получено 100: 1 усиление по сравнению с прямой вставкой значения, поскольку значение вставки ограничено 1000 строками за раз. В хранимой процедуре вставка в фактическую таблицу из TVP сортируется по кластерному индексу. Эти таблицы не имеют никакого индекса, кроме кластерного индекса. SP принимает TABLOCK, так как это таблицы с однократной записью и один загрузчик данных. Коэффициент заполнения 100. Нет увеличения размера данных или журнала транзакций - он рассчитан на общую загрузку данных. Напоследок к вопросу. За последние 4 часа было вставлено 200 миллионов строк. Время отклика вставки уменьшилось на 1/2. Если коэффициент заполнения равен 100, и я вставляю отсортированные по кластерному индексу, то почему падение ответа? Что я могу сделать это исправить?

Я не получил TVP, пока не использовал его - это похоже на обратный DataReader.

Я хотел бы поблагодарить вас за помощь и извиниться за неправильное формулирование проблемы. Для каждого анализа (в данном случае я анализирую 200 000) вставка сортируется по кластерному индексу. Однако только для 1 из 3 таблиц выполняется следующий анализ в целом в порядке кластерного индекса. После анализа 70000 хорошая таблица имеет плотность сканирования 99%, но две другие таблицы сильно фрагментированы с плотностью сканирования 12%.

Установите коэффициент заполнения 50 для двух фрагментированных таблиц и переиндексируйте. Теперь я получаю около 1/3 максимальной скорости. Мне просто нужно будет остановить процесс и переиндексировать каждые несколько часов.

В итоге я изменил кластерный индекс в соответствии с порядком вставки. Создан уникальный индекс того, что раньше было кластеризованным. Я отключаю уникальный, вставляю данные в индекс, а затем перестраиваю уникальный индекс. С этим сценарием я получаю производительность 300: 1 на 10-часовой пробежке. Это не лишние 0 - триста к одному. И это не обман - по сравнению с началом с упорядоченным индексом и коэффициентом заполнения или 30. Даже с дополнительным индексом размер моей таблицы меньше, поскольку у меня могут быть оба коэффициента заполнения на 100.

Я использую #temp в некоторых запросах, чтобы получить строки в порядке, известном только запросу. Я преобразовал #temp в TVP и получил 1/2 секунды (примерно время, необходимое для создания и удаления #temp).

1 Ответ

0 голосов
/ 09 марта 2012

За операцию преобразования преобразующего комментария в ответ ...

В дополнение к автоматической статистике, как упоминает @SqlACID, проверка ограничений может стать более дорогой по мере заполнения таблицы.Если я собираюсь серьезно загрузить таблицу, я обычно планирую отключить или отбросить индексы и ограничения, а затем воссоздать их после, если скорость - моя конечная цель.Это может означать удаление строк после факта, если ограничение нарушено, или, если это возможно, более тщательная проверка больших объемов данных, если это возможно.

...