Низкая производительность в Sql Express после вставки больших кусков данных - PullRequest
1 голос
/ 19 июня 2009

Мы заметили, что наши запросы выполняются медленнее в базах данных, в которые были добавлены большие фрагменты данных (массовая вставка) по сравнению с базами данных, в которых данные добавлялись по записи на каждую запись, но с аналогичным объемом данных. Мы используем Sql 2005 Express и пытались переиндексировать все индексы без каких-либо лучших результатов. Знаете ли вы о какой-то структурной проблеме в базе данных, которая может быть вызвана вставкой данных большими кусками вместо одного за другим?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Один совет, который я видел, это отключить автоматическое создание статистики и автоматическое обновление статистики перед выполнением массовой вставки:

ALTER DATABASE databasename SET AUTO_CREATE_STATISTICS OFF WITH NO_WAIT

ALTER DATABASE databasename SET AUTO_UPDATE_STATISTICS OFF WITH NO_WAIT

Впоследствии создание статистики вручную одним из 2 способов:

--generate statistics quickly using a sample of data from the table
exec sp_createstats 

или

--generate statistics using a full scan of the table
exec sp_createstats @fullscan = 'fullscan'

Возможно, вам следует также включить автоматическое создание и автоматическое обновление статистики, когда вы закончите.

Другим вариантом является проверка и дефрагментация индексов после массовой вставки. Прочтите сообщение в блоге Пинала Дейва .

0 голосов
/ 19 июня 2009

Это интересный вопрос.

Я бы предположил, что Express и не Express имеют одинаковую структуру хранения, поэтому, когда вы используете Google для других людей с похожими проблемами, не ограничивайте себя поиском в Google для проблем в версии Express. С другой стороны, массовая вставка - это обычная операция, и производительность важна, поэтому я не думаю, что это ранее необнаруженная ошибка.

Один очевидный вопрос: что такое кластерный индекс? Является ли кластерный индекс также первичным ключом? Первичный ключ не назначается при вставке и, следовательно, инициализируется базой данных? Если это так, то, возможно, существует разница (между двумя методами вставки) в шаблоне или последовательности последовательных значений, назначаемых базой данных, которая влияет на способ кластеризации данных, что затем влияет на производительность.

Что-то еще: помимо индексов, люди говорят, что SQL использует статистику (которую он создал в результате выполнения предыдущих запросов) для оптимизации своего плана выполнения. Я не знаю каких-либо подробностей этого, но помимо «переиндексации всех индексов», проверьте планы выполнения ваших запросов в двух тестовых случаях, чтобы убедиться, что планы идентичны (и / или проверьте связанную статистику).

0 голосов
/ 19 июня 2009

Вероятно, SQL Server выделил новое дисковое пространство во многих маленьких порциях. При выполнении больших транзакций лучше заранее выделить много места как в файлах данных, так и в файлах журналов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...