Как я могу сказать, ПОЧЕМУ вставка в определенную таблицу идет медленно?

29

Я знаю, что INSERT для таблицы SQL может быть медленным по ряду причин:

  • Наличие INSERT TRIGGER на столе
  • Множество принудительных ограничений, которые необходимо проверить (обычно внешние ключи)
  • Страница разделяется в кластеризованном индексе, когда строка вставляется в середину таблицы
  • Обновление всех связанных некластеризованных индексов
  • Блокировка от другой активности на столе
  • Плохое время отклика ввода-вывода
  • ... что я пропустил?

Как я могу сказать, кто отвечает в моем конкретном случае? Как я могу измерить влияние разбиения страниц на обновления некластеризованного индекса и всего остального?

У меня есть сохраненный процесс, который вставляет около 10000 строк за раз (из временной таблицы), что занимает около 90 секунд на 10 000 строк. Это недопустимо медленно, так как это приводит к превышению времени ожидания других движений.

Я посмотрел на план выполнения и увидел задачу INSERT CLUSTERED INDEX и все INDEX SEKKS из запросов FK, но он все еще не говорит мне наверняка, почему это занимает так много времени. Никаких триггеров, но в таблице есть несколько FKeys (которые, похоже, правильно проиндексированы).

Это база данных SQL 2000.

BradC
источник
Включено ли автоматическое расширение для ваших файлов данных? Это может вызвать проблемы с производительностью в конфигурации по умолчанию.
Ларри Коулман
Мы говорим об использовании профилировщика? msdn.microsoft.com/en-us/library/ms187929.aspx
Инкогнито
@Larry: файлы данных имеют значительное свободное пространство, поэтому я не верю, что рост файлов данных - это проблема. Хороший, чтобы добавить в список "вещей для проверки", хотя.
BradC
@ user210: Профилирование завершения оператора просто показывает, что это заняло 90 секунд, а не ПОЧЕМУ. Если нет других событий, которые, по вашему мнению, будут более показательными.
BradC

Ответы:

10

Некоторые вещи, которые вы можете посмотреть на ...

Уменьшите размер пакета с 10000 до чего-то меньшего, например, 2000 или 1000 (вы не сказали, какой у вас размер строки).

Попробуйте включить статистику ввода-вывода, чтобы увидеть, сколько операций ввода-вывода FK выполняет.

Что вызывает ожидание, когда происходит вставка (master.dbo.sysprocesses)?

Давайте начнем здесь и посмотрим, куда мы идем.

mrdenny
источник
2
Помогает уменьшение размера пакета (1000 записей занимает ~ 25 секунд). Это может быть нашим текущим «обходным путем». Я посмотрю, смогу ли я определить статистику ввода-вывода и ожидания (задание запускается клиентом по требованию, когда у него есть файл для обработки, поэтому я не всегда могу предсказать, когда задание действительно будет выполнено).
BradC
7

Бред,

Вы должны проверить статистику ожидания для вашего запроса. С SQL2000 вы можете использовать синтаксис DBCC SQLPERF ("waitstats") для получения этих деталей.

SQLRockstar
источник
6

Я могу сказать, что я ищу при анализе производительности запроса. Может быть, это поможет.

  • анализировать план выполнения запроса и проверять сканирование индекса, сканирование таблицы, использование функций convert_implicit для типов данных sql, параллелизм.
  • запустите запрос с SET STATISTICS IO ON и SET STATISTICS TIME ON, чтобы увидеть время выполнения и чтение / запись io для каждой вставки.
  • проверьте время ожидания от sysprocesses для вашего сеанса spid.
  • запустить профилировщик и выбрать стандартный шаблон. выберите следующее: Статистика производительности (если повторяется, то ваш план составляется много раз - не очень хорошо), RPC: выполнено, SQL: batchcompleted и SQL: batchstarting. Добавьте к ним колонки rowcounts , чтобы увидеть именно количество строк в пакете. Отфильтруйте результаты, чтобы увидеть только ваш запрос.
  • наконец соберите счетчик продолжительности жизни страницы из windows perfmon, и если он меньше 300 (5 минут), то у SQL недостаточно памяти. Собирайте счетчики дисков: длина очереди диска , Disk Time (файлы данные диска), Disk Time (файлы журнал диск) , чтобы увидеть , если есть давление на дисках.
yrushka
источник
5

Попробуйте использовать:

SET STATISTICS IO ON

а также

SET STATISTICS PROFILE ON

СТАТИСТИКА IO

Может быть полезно сообщить вам, какие таблицы выполняет наибольшее количество операций сканирования таблиц, логических чтений и физических чтений (я использую эти три, чтобы сосредоточиться на том, какая часть плана запроса нуждается в наибольшей настройке)

СТАТИСТИЧЕСКИЙ ПРОФИЛЬ

В первую очередь будет возвращать план запроса в табличном формате, затем вы можете посмотреть на столбцы ввода-вывода и ЦП, чтобы узнать, сколько стоит наибольшее количество в запросе (это сканирование таблицы в вашей временной таблице по сравнению с сортировкой, которую она делает для вставки в ваш запрос). кластерный ключ и т.д ...)

Эндрю Бикертон
источник