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

1 ... 89 90 91 [ 92 ] 93 94 95 ... 469


1000, а поскольку у меня размер блока - 8 Кбайт, то сервер Oracle должен б1л втде-лить (8192 * 1009) байт. Мы получили несколько больший результат; это связано с округлением количества выделяемых экстентов и/или использованием локально управляемого табличного пространства с экстентами одинакового размера.

Мы столкнулись с одной из проблем при использовании хеш-кластеров, которую необходимо учитывать. Обычно при создании пустой таблицы количество блоков до отметки максимального уровня равно 0. При ее полном просмотре сразу достигается отметка максимального уровня, и просмотр завершается. При использовании хеш-кластера таблицы - изначально большие и создаваться будут дольше, поскольку сервер Oracle должен проинициализировать каждый блок, что обычно происходит лишь при добавлении данных в таблицу. Таблицы могут иметь данные в первом и в последнем блоке, а остальные будут пустыми. Полный просмотр практически пустого хеш-кластера потребует столько же времени, как и полного. Это не всегда плохо: хеш-кластер создается для очень быстрого доступа к данным по ключу, а не для частого полного просмотра.

Теперь можно помещать таблицы в хеш-кластер точно так же, как это делается для индексных кластеров. Например:

tkyte@TKYTE816> create table hashed table

2 (x number, data1 varchar2(4000), data2 varchar2(4000))

3 cluster hash cluster(x);

Table created.

Чтобы продемонстрировать отличие хеш-кластера, я создал небольшой тестовый пример: создал хеш-кластер, загрузил в него немного данных, скопировал эти данные в обычную таблицу с обычным индексом, а затем выполнил 100000 случайных чтений из каждой таблицы (в равной степени случайные чтения). С помощью параметра SQLTRACE и утилиты TKPROF (подробнее об этих средствах см. в главе 10, посвященной стратегиям и средствам настройки) я определил производительность работы с каждой из них. Вот что я делал и как анализировал результаты:

tkyte@TKYTE816> create cluster hash cluster

2 (hash key number)

3 hashkeys 50000

4 size 45

Cluster created.

tkyte@TKYTE816> create table emp

2 cluster hash cluster(empno)

3 as

4 select rownum empno, ename, job, mgr, hiredate, sal, comra, deptno

5 from scott.emp

6 where 1=0

Table created.

Определив, что средний размер строки в таблице будет 45 байт (для этого я проанализировал таблицу SCOTT.EMP), я создал хеш-кластер с параметром SIZE, равным 45



байт. Затем я создал в кластере пустую таблицу, по структуре аналогичную таблице SCO.EMP. Единственное изменение - выбор ROWNUM вместо EMPNO, так что в созданной мной таблице этот столбец имеет тип NUMBER, а не NUMBER(4). В таблице заведомо должно быть более 9999 строк, поскольку я собираюсь вставить туда около 50000.

Затем я заполнил данными таблицу и создал ее обычный аналог:

tkyte@TKYTE816> declare

2 1 cnt number;

3 l empno number default 1;

4 begin

5 select count(*) into l cnt from scott.emp;

7 for x in (select * from scott.emp)

8 loop

9 for i in 1 .. trunc(50000/l cnt)+l

10 loop

11 insert into emp values

12 (l empno, x.ename, x.job, x.mgr, x.hiredate, x.sal,

13 x.comm, x.deptno) ;

14 l empno := l empno+l;

15 end loop;

16 end loop;

17 commit;

18 end;

19 /

PL/SQL procedure successfully completed.

tkyte@TKYTE816> create table emp reg

2 as

3 select * from emp; Table created.

tkyte@TKYTE816> alter table emp reg add constraint emp pk primary key(empno);

Table altered.

Теперь осталось только получить случайные данные для выборки строк из каждой таблицы:

tkyte@TKYTE816> create table random (x int) ; Table created.

tkyte@TKYTE816> begin

2 for i in 1 . . 100000

3 loop

4 insert into random values

5 (mod (abs(dbms random.random),50000)+l);

6 end loop;



7 end;

PL/SQL procedure successfully completed.

Теперь все готово для тестирования: tkyte@TKYTE816> alter session set sql trace=true; Session altered.

tkyte@TKYTE816> select count(ename)

2 from emp, random

3 where emp.empno = random.x;

COUNT (ENAME)

tkyte@TKYTE816> select count(ename)

2 from emp reg, random

3 where emp reg.empno = random.x;

COUNT (ENAME)

100000

Я знал, что оптимизатор должен выбрать метод FULL SCAN random в обоих случаях, поскольку другого метода доступа к этой таблице не существует. Я полагал, что будет выполняться соединение вложенными циклами с таблицами ЕМР и EMPREG (что и происходило). В результате б1ло выполнено 100000 случайных чтений из двух этих таблиц. В отчете TKPROF я обнаружил следующее:

select count(ename) from emp, random where emp.empno = random.x

call

count

elapsed

disk

query

current

rows

0.00

0,00

Ex*cut

0.00

0.00

F tch

3.44

3.57

177348

total

3.44

3.57

177348

£

Misses in

library

cache

during parse: 1

Optimizer goal: CHOOSE Parsing user id: 66

Rows

Row Source Operation

1 SORT AGGREGATE

100000 NESTED LOOPS

100001 TABLE ACCESS FULL RANDOM 100000 TABLE ACCESS HASH EHF





1 ... 89 90 91 [ 92 ] 93 94 95 ... 469

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