Я знаю, что INSERT для таблицы SQL может быть медленным по ряду причин:
- Наличие INSERT TRIGGER на столе
- Множество принудительных ограничений, которые необходимо проверить (обычно внешние ключи)
- Страница разделяется в кластеризованном индексе, когда строка вставляется в середину таблицы
- Обновление всех связанных некластеризованных индексов
- Блокировка от другой активности на столе
- Плохое время отклика ввода-вывода
- ... что я пропустил?
Как я могу сказать, кто отвечает в моем конкретном случае? Как я могу измерить влияние разбиения страниц на обновления некластеризованного индекса и всего остального?
У меня есть сохраненный процесс, который вставляет около 10000 строк за раз (из временной таблицы), что занимает около 90 секунд на 10 000 строк. Это недопустимо медленно, так как это приводит к превышению времени ожидания других движений.
Я посмотрел на план выполнения и увидел задачу INSERT CLUSTERED INDEX и все INDEX SEKKS из запросов FK, но он все еще не говорит мне наверняка, почему это занимает так много времени. Никаких триггеров, но в таблице есть несколько FKeys (которые, похоже, правильно проиндексированы).
Это база данных SQL 2000.
Ответы:
Некоторые вещи, которые вы можете посмотреть на ...
Уменьшите размер пакета с 10000 до чего-то меньшего, например, 2000 или 1000 (вы не сказали, какой у вас размер строки).
Попробуйте включить статистику ввода-вывода, чтобы увидеть, сколько операций ввода-вывода FK выполняет.
Что вызывает ожидание, когда происходит вставка (master.dbo.sysprocesses)?
Давайте начнем здесь и посмотрим, куда мы идем.
источник
Бред,
Вы должны проверить статистику ожидания для вашего запроса. С SQL2000 вы можете использовать синтаксис DBCC SQLPERF ("waitstats") для получения этих деталей.
источник
Я могу сказать, что я ищу при анализе производительности запроса. Может быть, это поможет.
источник
Попробуйте использовать:
а также
СТАТИСТИКА IO
СТАТИСТИЧЕСКИЙ ПРОФИЛЬ
источник