#sql-server
Вопрос:
У меня в коде есть большая инструкция insert (в среднем около 50 000 записей на вставку), которая обычно завершается в течение 2 секунд или около того для каждой «группы». Одна из этих групп-меньшая, называемая PRL (примерно 20 000 на вставку), и для этой группы, возможно, 1 из 10 раз, вставка займет в общей сложности 9 минут.
Я сузил это до самого оператора SELECT, поскольку я изменил процесс, чтобы сначала вставить его во временную таблицу, а затем в саму фактическую таблицу, и теперь мы сначала видим задержку во временной таблице, а затем фактическая таблица занимает 2 секунды или около того, как ожидалось.
Мы подумали, что это может быть связано с обнюхиванием параметров, когда SQL создает план запроса для других более крупных групп, а затем неправильно использует план для PRL. Однако мой менеджер посоветовал мне отказаться от этой идеи, так как мы также увидим это для других групп, а не только исключительно для PRL (всего примерно 15 групп или около того).
У кого-нибудь есть какие-либо рекомендации или идеи о том, как я могу исследовать эту проблему дальше? Я также исследовал таблицу, в которую мы вставляем, и ее кластеризованные индексы, но есть только один кластеризованный индекс, и, насколько я понимаю, проблема вставок обычно возникает только в таблицах с несколькими кластеризованными хранилищами столбцов.
Заранее спасибо за любую помощь и извините за некоторую расплывчатость. Пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.
Комментарии:
1. Похоже на бутылочное горлышко дискового ввода-вывода. Если вы отслеживаете счетчики производительности «Длина очереди на диске» и «Сек/Передача диска» на томе/томах, на которых размещена база данных tempdb, увеличиваются ли они на время вставки базы данных tempdb? Случайно ли они поддерживаются массивом RAID, у которого есть неисправный диск?
2. План запроса поможет, пожалуйста, поделитесь через brentozar.com/pastetheplan . Какой результат вы получите от
select status, blocking_session_id, wait_type, wait_time, wait_resource, cpu_time, reads, writes from sys.dm_exec_requests where session_id = @YourBlockedSession
этого . Еслиblocking_session_id
не равно нулю, то каков результат этого сеанса?