Продолжаем обсуждать пакет Runstats. Для чего он нужен? Действительно ли это незаменимое средство для разработчиков приложений под Oracle?
Runstats - это инструмент, который разработал Том Кайт для сравнения двух разных методов выполнения того же действия и выбора лучшего из них. Вы передаете инструменту Runstats два метода, а он делает все остальное. Runstats производит следующие три ключевых измерения.
- Время в формате часов, минут и секунд или пройденное время. Эту информацию полезно знать, но она не является самой важной.
- Статистика системы. Отображает рядом данные о том, сколько раз каждый из подходов делал что-либо (например, обращался к синтаксическому анализатору), и разницу между ними.
- Сведения о защелкивании. Это основная часть отчета.
Защелка представляет собой легковесную блокировку. Блокировки - это механизмы сериализации, подавляющие параллелизм. Приложения, которые подавляют параллелизм, являются менее масштабируемыми, могут поддерживать меньшее число пользователей и требуют больший объем ресурсов. Наша цель всегда заключается в построении приложений, обладающих потенциалом масштабирования - приложений, которые могут обслуживать как одного, так и 1000 или 10 000 пользователей. Чем меньше происходит защелкивания, тем лучше. Я могу выбрать подход, который приводит к увеличению времени выполнения, но снижает количество защелок до 10% по отношению к другому подходу. Мне известно, что подход, использующий меньше защелок, будет масштабироваться значительно лучше, чем подход с более высоким числом защелок.
Утилиту Runstats лучше всего применять в изоляции, т.е. в однопользовательской базе данных. Мы будем измерять статистические показатели и активность по защелкиванию (блокированию) данных, которые присущи анализируемым подходам. Мы не хотим, чтобы во время этих измерений другие сеансы вносили свой вклад в загрузку системы или защелкивание. Для проведения тестов подобного рода удобно иметь небольшую тестовую базу данных. Например, я часто использую свой настольный ПК или ноутбук.
Важно! Я уверен, что все разработчики должны располагать полностью контролируемой испытательной базой данных, в которой они смогут проверять свои идеи, не обращаясь постоянно за помощью к администратору базы данных. Разработчики определенно должны иметь такую базу данных на своих настольных ПК, даже если лицензия в персональной версии для разработчика предполагает просто "применение ее для разработки и тестирования, но не для развертывания". В этом случае нечего терять! Кроме того, я проводил несколько неформальных опросов на конференциях и семинарах. Практически каждый администратор баз данных начинал свою деятельность как разработчик! Опыт и обучение, которое разработчики могут получить при наличии собственной базы данных - имея возможность видеть, как она в действительности работает - в долгосрочной перспективе сулит значительные преимущества.
Чтобы использовать Runstats, понадобится настроить доступ к нескольким представлениям V$, создать таблицу для хранения статистики и создать пакет Runstats. Потребуется доступ к четырем таблицам V$ (динамическим таблицам производительности): V$STATNAМE, V$MYSTAT, V$TIMER и V$LATCH. Вот представление, с которым я работаю:
create or replace view stats
as select 'STAT . . . ' || a.name name, b.value from v$statname а, v$mystat Ь
where a.statistic# = b.statistic#
union all
select 'LATCH.' || name, gets
from v$latch
union all
select 'STAT . . . Elapsed Time' , hsecs from v$timer;
Важно! Действительными именами объектов, к которым должен быть предоставлен доступ, являются V_$STATNAМE, V_$MYSTAT и т.д. - имена объектов начинаются с V_$, а не V$. Имя V$ - это синоним, который указывает на представление с именем, начинающимся с v _ $. Таким образом, V$STATNAМE - синоним, указывающий на представление v_ $STATNAМE. У вас должен быть открыт доступ к этому представлению.
Вы можете иметь привилегию SELECT на V$STATNAМE, V$MYSTAT и V$LATCH, выданную непосредственно вам, так что у вас будет возможность создать представление самостоятельно. Кроме того, кто-то другой, располагающий привилегией SELECT на этих объектах, может создать представление и затем выдать вам привилегию SELECT на нем. Осталось создать небольшую таблицу для сбора статистики:
create global temporary table run stats
( runid varchar2 ( 15) , -
name varchar2 (80) , value int )
on commit preserve rows ;
Наконец, необходимо создать сам пакет для Runstats. Он содержит три простых АРI-вызова:
- RS_START (запуск Runstats) - процедура, которая должна вызываться в начале теста Runstats;
- RS_MIDDLE - процедура, которая должна вызываться в середине теста;
- RS_STOP - процедура, которая завершает выполнение и выводит отчет.
Спецификация этого пакета выглядит следующим образом:
EODA@ORA12CR1> create or replace package runstats_pkg
2 as
3 procedure rs_start; 4 procedure rs_rniddle;
5 procedure rs_stop ( p_difference threshold in number default 0 ) ;
6 end;
7 /
Package created. Пакет создан.
Параметр р_difference_threshold служит для управления объемом выводимых в конце данных. Пакет Runstats собирает статистические сведения и информацию о защелках для каждого запуска, после чего выводит отчет о количестве используемых каждым тестом (каждым подходом) ресурсов и разнице между ними. Этот входной параметр можно применять для вывода только тех статистических сведений и информации о защелках, которые отличаются больше, чем на это число. По умолчанию значение p_difference_threshold равно нулю, поэтому отображаются все результаты.