Программирование >>  Oracle 

1 ... 370 371 372 [ 373 ] 374 375 376 ... 469


Права вызывающего и создателя

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

VERSION GOUNT

: 1

LOADED VERSIONS

: 1

PARSE GALLS

: 10

OPTIMIZER MODE

: GHOOSE

SQL TEXT

: SELEGT GOUNT(*)

SHARABLE MEM

: 4212

VERSION GOUNT

: 1

LOADED VERSIONS

: 1

PARSE GALLS

: 10

optimizer mode

: CHOOSE

SQL TEXT

: SELECT COUNT(*)

SHARABLE MEM

: 31941

VERSION COUNT

: 10

loaded versions

: 10

PARSE CALLS

: 10

OPTIMIZER mode

: MULTIPLE CHILDREN

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 для этого сеанса можно найти следующее:

OVERALL

TOTALS

FOR ALL

RECURSIVE

STATEMENTS

call

count

elapsed

query

current

Parse

1148

17.95

18.03

Execute

1229

0.29

0.25

Fetch

1013

0.14

0.17

2176

total

3390

18.38

18.45

2231

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;



1 ... 370 371 372 [ 373 ] 374 375 376 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика