Книги и статьи по SQL Rambler's Top100 Switch language to: English 29 марта 2024 г. 8:24:07


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Отслеживание роста базы данных tempdb

Brian Moran (оригинал: Tracking tempdb growth.)
Перевод Моисеенко С.И.

Читатели часто обращаются ко мне с историями безудержного роста tempdb . Один администратор баз данных недавно устанавливал более новую версию приложения и заметил, что база данных tempdb , изначально установленная на 80 МБ, внезапно резко выросла до 8Gb и более. Вопрос: как отследить рост tempdb и связать этот рост с выполнением конкретных команд?

Ниже приводятся три эффективных способа отслеживания роста tempdb . Во-первых, Вы можете использовать счетчик Data File(s) Size (KB) ( Размер файла данных) Монитора производительности (Performance Monitor), связанный с экземпляром tempdb для объекта производительности базы данных. Использование этого счетчика - хороший способ узнать, когда файл tempdb начинает расти. Вы можете также получить доступ к этим данным непосредственно из SQL Server , выполнив запрос к таблице master .. sysperfinfo , которая материализует все счетчики монитора производительности, экспортируемые SQL Server . Во-вторых, Вы можете периодически проверять вывод sp_spaceused на tempdb . И, наконец, Вы можете использовать функцию fn_virtualfilestats (), чтобы отследить ввод/вывод, который SQL Server записывает в файлы базы данных, которые использует tempdb . Если tempdb растет, вероятной причиной является физический ввод/вывод, связанный с определенными запросами. В этом случае контроль данных fn_virtualfilestats поможет уменьшить список «подозрительных» запросов, вызывающих рост tempdb . Любой из этих методов позволяет отслеживать рост tempdb в течение конкретного периода времени.

Чтобы найти связь роста tempdb с запросами его вызывающими, Вы можете запустить трассу SQL Server Profiler в процессе слежения за ростом tempdb . Нет никакого непосредственного способа узнать, какой именно запрос вызывает тот или иной прирост tempdb , но Вы можете сделать некоторые предположения, которые помогут Вам отыскать запросы, потенциально являющиеся виновниками этого роста. Основное предположение состоит в том, что любой запрос, который может заставить tempdb расти большими объемами, например, такими, о которых сообщал выше администратор баз данных, будет выполняться значительно дольше по сравнению с типичными запросами к данной базе. Эти запросы, вероятно, покажут также относительно высокое значение в столбце данных WRITES трассы в Profiler . Обнаружение операторов SPOOL в плане выполнения запроса является еще одним признаком того, что SQL Server выполняет большое количество операций записи в tempdb . Оператор SPOOL означает, что SQL Server записывает промежуточный результирующий набор во вторичную память (tempdb), чтобы впоследствии воспользоваться этими данными для реализации плана.

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

Есть еще одна идея. Мой опыт подсказывает, что полное или частичное декартово произведение может вызвать интенсивный рост tempdb - и не забывайте искать для его обнаружения операторы SPOOL ! Profiler имеет событие, называемое «пропавший предикат соединения» (Missing Join Predicate) , в классе событий ошибок и предупреждений, которое отлавливает ситуации, в которых SQL Server думает, что предикат соединения отсутствует. Я никогда не проверял логику, которую использует SQL Server , чтобы решить, что предикат отсутствует, поэтому не могу утверждать, что он всегда обнаруживает пропущенный предикат в JOIN . Но я включаю это событие в мой стандартный анализ трассы, и неоднократно успешно идентифицировал много декартовых произведений (которые не были ранее обнаружены различными командами разработчиков приложений, которых я консультировал), просматривая экземпляры этого события.

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.