2010-12-31 5 views
0

У меня есть хранимая процедура, которую я использую, чтобы заполнить таблицу примерно 60 столбцами. Я genereated 1000 заявлений EXEC, которые выглядят следующим образом:Как запустить хранимую процедуру 1000 раз

exec PopulateCVCSTAdvancement 174, 213, 1, 0, 7365 
exec PopulateCVCSTAdvancement 174, 214, 1, 0, 7365 
exec PopulateCVCSTAdvancement 175, 213, 0, 0, 7365 

Каждый раз, когда хранимая процедура будет вставить в любом месте от 1 до 3000 записей (обычно около 2000 записей). На «сервере» работает настольное оборудование с 4 гигабайтами доступной памяти на серверной ОС. Проблема в том, что после первых 10-15 выполнения в среднем по 1-2 секунды каждый раз, следующие 10-15, кажется, никогда не заканчиваются. Правильно ли я делаю это? Как мне это сделать?

Спасибо! Топ 10 официантов:

LAZYWRITER_SLEEP 
SQLTRACE_INCREMENTAL_FLUSH_SLEEP 
REQUEST_FOR_DEADLOCK_SEARCH 
XE_TIMER_EVENT 
FT_IFTS_SCHEDULER_IDLE_WAIT 
CHECKPOINT_QUEUE 
LOGMGR_QUEUE 
SLEEP_TASK 
BROKER_TO_FLUSH 
BROKER_TASK_STOP 
+0

Вам нужно выяснить, что такое узкое место. Что говорит DMST waitstats? –

+0

В этой таблице содержится более 400 строк. Что-нибудь конкретное я должен опубликовать? –

+1

цифры в нем кумулятивные, поэтому сделайте снимок во временную таблицу, затем выполните действие, которое генерирует длительное ожидание, а затем сравните два, чтобы увидеть, какие типы ожидания больше всего увеличились. (Или просто сбросьте цифры в DMV до 0 с помощью «DBCC SQLPERF» («sys.dm_os_wait_stats», CLEAR); «если у вас нет инструментов мониторинга, полагающихся на него) –

ответ

0

Оказался, причина была из-за ошибки в моей хранимой процедуре при работе с определенными параметрами.

В частности, у меня был cte, к которому я присоединился назад к другой таблице, однако некоторые критерии соединения из cte содержали нулевые значения и заставляли его продолжать навсегда. Простой isnull() в критериях выбора cte решил проблему. Благодаря всем, что помогло.

P.S. Для выполнения операции потребовалось 4 минуты, как только я завернул ее в транзакцию.

1

завернуть его в сделке - это будет загружаться значительно быстрее

+0

Согласен, но я не могу понять, почему это объясняет внезапную разницу во времени (если, возможно, контрольно-пропускной пункт не может быть включен?) –

+0

Сделка не имела никакого эффекта –

+0

(говорящий для mysql), при обработке транзакции запрос строится полностью и THEN выполняется (максимально оптимизировано). – sethvargo

3

Случайные мысли:

  1. Убедитесь, что размер базы данных достаточно большой, чтобы принять Autogrow из уравнение. Рост по умолчанию составляет 10%, и возможно, что вы выращиваете базу данных. Это относится как к MDF, так и к LDF.

  2. Как проверять размер LDF, изменить модель восстановления с SIMPLE тоже на время загрузки

  3. Вы можете иметь параметр нюхают. Вы можете добавить optimise for unknown подсказку к сохраненному проку

+0

Хорошие советы. Найденный журнал был установлен на 10% авторазработки. Проверка на других сейчас. –

+0

Был уже установлен на простой. Я также добавил перекомпиляцию в sp. –

Смежные вопросы