Я уже более недели работаю над проблемой производительности хранимой процедуры и связан с другим моим сообщением в Stackoverflow here. Позвольте мне дать вам некоторую справочную информацию.Интригующая проблема настройки производительности SQL Server
У нас есть ночной процесс, который запускается и запускается хранимой процедурой, которая вызывает много многих других хранимых процедур. Многие вызываемые хранимые процедуры вызывают другие и т. Д. Я посмотрел на некоторые из вызванных процессов и там есть всевозможные пугающие сложные вещи, такие как обработка XML-строк, ненужное чрезмерное использование курсоров, подсказки NOLOCK чрезмерно используемые, редкое использование комплексной обработки и т. д. - список продолжается, это довольно ужасно.
Этот ночной процесс в нашей производственной среде занимает в среднем 1:15 для запуска. Иногда требуется 2 часа, что неприемлемо. Я создал тестовую среду на идентичном аппаратном обеспечении для производства и запускает proc. Потребовалось 45 минут, когда я его запустил. Если я восстановил базу данных в одну и ту же точку и запустил ее снова, это займет больше времени: действительно, если я повторю это действие несколько раз (восстановление и повторное выполнение), процесс занимает более продолжительное время, пока он не станет плато около 2 часов. Это действительно озадачивает меня, потому что я каждый раз восстанавливаю базу данных в одну и ту же точку. На сервере нет других пользовательских баз данных.
Я думал, что из двух направлений исследований, чтобы продолжить:
- планов запросов и параметры подмены
- базы данных Tempdb
В качестве теста, я перезагрузил SQL Server, чтобы очистить этот кэш и tempdb и перезапустить proc с тем же восстановлением базы данных. Процесс занял 45 минут. Я повторил это несколько раз, чтобы убедиться, что это повторяемо - снова это заняло 45 минут каждый раз. Затем я начал несколько тестов, чтобы попытаться изолировать загадочное увеличение времени работы, когда SQL Server не получает перезапущен:
- Выполнить начальную хранимую процедуру С RECOMPILE
- Перед выполнением процедуры, executre DBCC FREEPROCCACHE очистить из кэша процедур
- Перед выполнением процедуры, выполните CHECKPOINT с последующим DBCC DROPCLEANBUFFERS для того, чтобы кэш был пуст и чист
Выполненный следующий сценарий, чтобы обеспечить все хранимые процедуры были отмечены для перекомпиляции:
DECLARE @proc_schema SYSNAME DECLARE @proc_name SYSNAME DECLARE prcCsr CURSOR local FOR SELECT specific_schema, specific_name FROM INFORMATION_SCHEMA.routines WHERE routine_type = 'PROCEDURE' OPEN prcCsr FETCH NEXT FROM prcCsr INTO @proc_schema, @proc_name DECLARE @stmt NVARCHAR(MAX) WHILE @@FETCH_STATUS = 0 BEGIN SET @stmt = N'exec sp_recompile ''[' + @proc_schema + '].[' + @proc_name + ']''' -- PRINT @stmt -- DEBUG EXEC (@stmt ) FETCH NEXT FROM prcCsr INTO @proc_schema, @proc_name END
Во всех приведенных выше тестах, процедура занимает больше времени и больше времени, чтобы работать с одной базой данных восстановления. Теперь я действительно в недоумении, что попробовать. Взгляд в код на этом этапе - это вариант, но реалистично это займет 3-6 месяцев, чтобы оптимизировать его, поскольку там есть много возможностей для улучшения. Я действительно заинтересован в том, чтобы понять, почему время выполнения proc увеличивается каждый раз, когда восстановление базы данных было выполнено даже при очистке кэша процедур и буферов?
Я также исследовал tempdb и попытался очистить старые таблицы там, как описано в моей другой записи stackoverflow, но я не могу вручную очистить временные таблицы, созданные из переменных таблицы вручную, и они не кажутся хотеть исчезнуть самостоятельно (даже после того, как они оставят их в течение 24 часов).
Любое понимание или предложения по дальнейшему тестированию были бы весьма признательны. Я запускаю 64-разрядную версию SQL Server 2005 с пакетом обновления 3 (SP3) для Windows 2003 R2 Ent. .
С уважением, Mark.
Вот предложение, которое суммирует все для меня. «Взгляд в код на этом этапе - это вариант, но реально его будет занимать 3-6 месяцев, чтобы оптимизировать его, поскольку там есть много возможностей для улучшения». – SQLMenace
ОБНОВЛЕНИЕ : Я решил предложить щедрость человеку, который может понять, почему процедура увеличивается, когда я восстанавливаю базу данных в тот же момент времени и запускаю ее снова. Я могу исключить следующее: курсоры, подготовка/удаление XML, кеш плана запроса (я выполнил восстановление и выполнил DBCC FREEPROCCACHE). Благодаря всем, кто внес вклад, были действительно большие ответы, но пока ничего такого не было указано в этом странном поведении. –
У вас есть процесс, который «настолько велик, что проверка планов запросов заставила мою SSMS генерировать ошибки из памяти», и ожидаете, что общие советы будут полезны? Почему вы не знаете, какая часть SQL становится медленнее? Кэши делают вещи быстрее. Оставлять вещи в tempdb/усекать их, а не удалять их быстрее. Почему вы думаете, что tempdb виноват? Вам нужно записать прошедшее время для каждого оператора SQL. Затем запустите его снова и посмотрите, какие заявления занимают больше времени. Тогда у вас есть куда начать. –