|
Программирование >> Oracle
Права вызывающего и создателя 1541 общедоступного синонима для таблицы T2 нет: я намеренно сделал, чтобы процедура IR PROC3 при выполнении обращалась к разным таблицам T2. Затем я создал десять пользователей с помощью следующего сценария: tkyte@TKYTE816> begin 10 11 12 13 14 for i in 1 .. 10 loop begin execute immediate drop user u i exception when others then null; end; execute immediate create user ui execute immediate grant create session, execute immediate alter user u i data quota unlimited on end loop; cascade; identified by pw; create table to ui; default tablespace data ; end; PL/SQL procedure successfully completed. и для каждого пользователя мы выполняем: create table t2 (x int); exec tkyte.dr proc exec tkyte.ir procl exec tkyte.ir proc2 exec tkyte.ir proc3 Необходимо зарегистрироваться как очередной пользователь, создать таблицу T2, а затем выполнить четыре интересующих нас процедуры. После того как это сделано от имени всех десяти пользователей, можно исследовать содержимое разделяемого пула с помощью представления VSSQLAREA, используя представленную ранее в этой главе процедуру PRINTTABLE: tkyte@TKYTE816> set serveroutput tkyte@TKYTE816> begin on size 1000000 print table (select sql text, sharable mem, version count, loaded versions, parse calls, optimizer mode from v$sqlarea where sql text like % DEMO\ R% escape \ and lower(sql text) not like %v$sqlarea% ) ; end; SQL TEXT DEMO IR 2 SHARABLE MEM VERSION COUNT LOADED VERSIONS PARSE CALLS OPTIMIZER MODE SELECT COUNT(*) FROM OPS$TKYTE.T 4450 : 1 : 1 CHOOSE SQL TEXT SHARABLE MEM SELECT COUNT(*) 4246 FROM T DEMO DR 1542 Глава 23
FROM T DEMO IR 1 FROM T2 DEM0 IR 3 PL/SQL procedure successfully completed. Хотя SQL-оператор во всех случаях один и тот же - SELECT COUNT(*) FROMT2 DEMO IR 3, - в разделяемом пуле для него есть десять разн1х экземпляров кода. Каждому пользователю необходим собственный оптимизированный план выполнения, поскольку запрос ссылается на разные объекты. В тех случаях, когда базовые объекты совпадали и привилегий хватало, планы выполнения SQL-операторов использовались совместно, как и ожидалось. Итак, если с помощью прав вызывающего вы собираетесь использовать один экземпляр кода для доступа к нескольким различным схемам, необходимо увеличить разделяемый пул, чтобы он вмещал все планы выполнения запросов. Так мы подходим ксле-дующей проблеме. Производительность При использовании процедур с правами вызывающего, как вы уже знаете, каждому пользователю может потребоваться отдельный специфический план выполнения запроса. На построение этих дополнительных планов могут потребоваться существенные ресурсы. Анализ запроса - одно из наиболее интенсивно нагружающих процессор действий сервера. Стоимость анализа уникальных запросов, который возможен при использовании подпрограмм с правами вызывающего, можно продемонстрировать с помощью утилиты TKPROF, показывающей продолжительность анализа операторов. Для выполнения следующего примера необходима привилегия ALTER SYSTEM: tkyte@TKYTE816>alter system flush shared pool; System altered. tkyte@TKYTE816> alter system set timed statistics=true; System altered. tkyte@TKYTE816>alter session set sql trace=true; Права вызывающего и создателя 1543 Session altered. tkyte@TKE816> declare 2 type rc is ref cursor; 3 l cursor rc; 4 begin for i in 1 .. 500 loop open l cursor for select close l cursor; end loop; end; from all objects t i; PL/SQL procedure successfully completed. При этом был выполнен анализ 500 уникальных операторов (в них используются уникальные псевдонимы таблицы). Ситуация аналогична использованию одной процедуры с правами вызывающего 500 пользователями в 500 различных схемах. В итоговом отчете утилиты TKPROF для этого сеанса можно найти следующее:
Misses in library cache during parse: 53 6 504 user SQL statements in session. 648 internal SQL statements in session. 1152 SQL statements in session. 0 statements EXPLAINed in this session. Теперь выполним блок, не анализирующий уникальный оператор 500 раз: tkyte@TKYTE816> alter system flush shared pool; System altered. tkyte@TKYTE816> alter system set timed statistics=true; System altered. tkyte@TKYTE816> alter session set sql trace=true; Session altered. tkyte@TKYTE816> declare 2 type rc is ref cursor; 3 l cursor rc; 4 begin 5 for i in 1 .. 500 loop 6 open l cursor for select * from all objects t; 7 close l cursor;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |