|
Программирование >> Oracle
Глава 11 102 dbms output.put line(round((dbms utility.gat time-1 start)/100, 2) seconds); 103 end; 104 / .02 seconds Он стабильно выполнялся примерно за 0,02 секунды. Потом я включил создание шаблонов: tkyte@TKYTE816> alter session set create stored outlines = testing; Session altered. tkyte@TKYTE816> declare l tmp char(l); l start number := dbms utility.get time; begin 2 select * into l tmp from tl; 3 select * into l tmp from t2; 4 select * into l tmp from t3; 99 select * into l tmp from t98; 100 select * into l tmp from t99; 101 select * into l tmp from t100; 102 dbms output.put line(round((dbms utility.get time-l start)/100, 2) seconds); 103 end; 104 / .82 seconds Первый раз, когда сохранялись шаблоны, выполнение продолжалось примерно 0,82 секунды. Потребовалось примерно столько же времени, как и для первоначального разбора запросов. После этого оказалось, что последующие выполнения продолжались примерно 0,02 секунды. После замедления, связанного с начальным запоминанием шаблонов, время выполнения стало таким же, как и до включения запоминания шаблонов. В загруженной многопользовательской среде результаты могут быть другими, и для достижения удовлетворительной производительности при работе с таблицами OUTLN может понадобиться настройка параметров (например, добавление списков свободных мест), чтобы принять большое количество одновременно вставляемых строк. При этом надо учесть следующее. Работать постоянно с установленным параметром CREATE STORED OUTLINES = TRUE не надо. Он устанавливается на некоторый период времени, чтобы перехватить интересующие вас запросы и планы их выполнения. В производственной среде обычно устанавливается параметр USE STORED OUTLINES = TRUE, а не CREATE. Идея в том, что даже если расходы ресурсов на генерацию планов будут существенными, это не будет делаться в производственной среде. Дополнительный расход ресурсов произойдет только в среде разработки или тестирования. Теперь давайте оценим расход ресурсов на фактическое использование хранимых планов для этих простых запросов: tkyte@TKYTE816> alter session set use stored outlines=testing; Session altered. Стабилизация плана оптимизатора 6.3 tkyte@TKYTE816> select used, count(*) from user outlines group by used; USED COUNT(*) UNUSED 100 tkyte@TKYTE816> declare l tmp char(l); l start number := dbms utility.get time; begin 2 select * into l tmp from tl; 3 select * into l tmp from t2; 4 select * into l tmp from t3; 99 select * into l tmp from t98; 100 select * into l tmp from t99; 101 select * into l tmp from t100; 102 dbms output.put line(round((dbms utility.get time-l start)/100, 2)jj seconds); 103 end; 104 / . 32 seconds PL/SQL procedure successfully completed. tkyte@TKYTE816> select used, count(*) from user outlines group by used; USED COUNT(*) USED 100 tkyte@TKYTE816> declare l tmp char(1); l start number := dbms utility.get time; begin 2 select * into l tmp from tl; 3 select * into l tmp from t2; 4 select * into l tmp from t3; 99 select * into l tmp from t98; 100 select * into l tmp from t99; 101 select * into l tmp from tlOO; 102 dbms output.put line(round((dbms utility.get time-l start)/100, 2>jj seconds); 103 end; 104 / .03 seconds PL/SQL procedure successfully completed. tkyte@TKYTE816> declare l tmp char(1); l start number := dbms utility.get time; begin 2 select * into l tmp from tl; 3 select * into l tmp from t2; 4 select * into l tmp from t3; Глава 11 99 select * into l tmp from t98; 100 select * into l tmp from t99; 101 select * into l tmp from t100; 102 dbms output.put line (round((dbms utility.get time-l start) /100, 2) seconds); 103 end; 104 / .03 seconds PL/SQL procedure successfully completed. Первый раз, когда пришлось повторно разбирать эти запросы после начала использования хранимых шаблонов, на их выполнение ушло 0,32 секунды. Если сравнить это значение с временем, затраченным на начальный разбор без использования хранимых шаблонов (без их сохранения или использования), оказывается, что время разбора существенно не изменилось. Мы также убедились, что хранимые шаблоны используются, поскольку в столбце USED после выполнения блока для всех строк вместо значения UNUSED появилось значение USED. А это признак того, что в запросах использовались подсказки. Последующее повторное выполнение этого же блока показало, что благодаря добавлению и сохранению подсказок в разделяемом пуле производительность при использовании хранимых шаблонов не снижается. Итак, использование хранимых шаблонов в приложении существенно не влияет на производительность разбора во время выполнения после первоначального разбора и помещения операторов в разделяемый пул. Использование хранимых шаблонов повышает производительность в той степени, насколько оптимален план выполнения запроса; изменение же хранимыми шаблонами текста запроса заметно на производительности не сказывается. Пространство имен шаблонов - глобально Казалось бы, что имена шаблонов, подобно другим объектам базы данных, например таблицам, должны быть уникальны в схеме пользователя-создателя. Тем не менее это не так. Имя шаблона должно быть уникальным в базе данных, аналогично имени табличного пространства или каталога. Наличие столбца OWNER в представлении USEROUTLINES сбивает с толку, ведь фактически шаблоном никто не владеет. В столбце OWNER указано имя пользователя, создавшего шаблон. В этом можно убедиться с помощью простого теста: tkyte@TKYTE816> create outline the outline 2 on select * from dual; Outline created. tkyte@TKYTE816> connect system system@TKYTE816> select owjner, name from dba outlines;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |