|
Программирование >> Oracle
Как и хеш-таблицы в языках программирования, хеш-таблицы в базе данных имеют фиксированный размер. При создании таблицы необходимо раз и навсегда определить, сколько хеш-ключей будет иметь таблица. Это не ограничивает количество строк, которые можно в нее поместить. Ниже графически представлен хеш-кластер, в котором создана таблица ЕМР. Когда клиент посылает запрос, использующий в условии ключ хеш-кластера, сервер Oracle применяет хеш-функцию, чтобы определить, в каком блоке искать данные. Если хеш-значения многократно повторяются или параметр SIZE в операторе CREATE CLUSTER имел слишком маленькое значение, серверу Oracle приходится выделять блоки остатка, связанные в цепочку с исходным блоком. Select * from emp where empno = 4321 Hash(4321) = блок 534 блоки базы данных 1 ..1000 ---------- дополнительные блоки При создании хеш-кластера используется тот же оператор CREATE CLUSTER, что и при использовании индексного кластера, но с другими опциями. Достаточно просто добавить опцию HASHKEYS, задающую размер хеш-таблицы. Сервер Oracle округляет значение HASHKEYS до ближайшего простого числа (поэтому количество хеш-ключей всегда выражено простым числом). Затем сервер Oracle умножает значение параметра SIZE на измененное значение HASHKEYS. После этого на диске выделяется под кластер соответствующее количество байтов. Это существенно отличается от индексного кластера, где пространство выделяется динамически, по мере надобности. Хеш-кластер же заранее выделяет пространство, достаточное для размещения (HASHKEYS/ trunc(blocksize/SIZE)> байтов данных. Так что, например, если значение SIZE установлено равным 1500 байт и используются блоки размером 4 Кбайт, сервер Oracle будет планировать хранение в блоке двух ключей. Если предполагается наличие 1000 хеш-ключей, сервер Oracle выделит под кластер 500 блоков. Интересно отметить, что, в отличие от обычной хеш-таблицы в языках программирования, совпадение хеш-значений вполне допустимо, а во многих случаях даже желательно. Вернувшись к примеру с таблицами DEPT/EMP, можно создать хеш-кластер по столбцу DEPTNO. Очевидно, что многие строки будут иметь одинаковое хеш-значение; это и предполагается, поскольку они имеют одинаковое значение DEPTNO. Кластер в общем-то и создается для совместного размещения сходных данных. Вот почему сервер Oracle требует указать значение параметров HASHKEYS (какое количество от- делов предполагается) и SIZE (какой объем данных будет ассоциироваться с кажд1м номером отдела). Он создает хеш-таблицу для хранения указанного количества отделов размером SIZE байтов каждый. Избегать надо непреднамеренных совпадений хеш-значений. Очевидно, что, если установить размер хеш-таблицы 1000 (фактически таблица будет иметь размер 1009, поскольку размер хеш-таблицы всегда выражается простым числом и сервер Oracle автоматически округляет переданное значение) и поместить в таблицу информацию о 1010 отделах, хотя бы одно совпадение точно будет (два разных номера отдела будут хешированы в одно и то же значение). Непреднамеренных совпадений хеш-значений следует избегать, поскольку они увеличивают расход ресурсов и вероятность фрагментации строк. Чтобы разобраться, как используется пространство для хеш-кластера, напишем небольшую служебную хранимую процедуру SHOWSPACE, которая будет использоваться в этой и в следующей главе, посвященной индексам. Эта процедура использует подпрограммы пакета DBMSSPACE, частично уже продемонстрированные ранее, для вхдачи информации о занимаемом объектами базы данных пространстве: tkyte@TKYTE816> create or replace 2 3 4 8 9 10 11 12 13 14 15 16 17 18 19 20 22 23 24 25 26 27 28 29 30 32 33 procedure show space (p segname in varchar2, p owner in varchar2 default user, p type in varchar2 default TABLE, p partition in varchar2 default NULL) l free blks number; l total blocks number; l total bytes number; l unused bloclcs number; l unused bytes number; l LastUsedExtFileId number; l LastOsedExtBlockId number; l last used block number; procedure p(p label in varchar2, begin dbms output.put line(rpad (p label,40,.) p num); end; begin dbms space.free blocks p num in number) (segment owner => segment name => segment type => partition name => freelist group id => free blks -> dbms space.unused space (segment ovmer => p owner, p segname, p type, p partition, 0, l free blks); p owner, 34 segment name => p segname, 35 segment type => p type, 36 partition name => p partition, 37 total blocks => l total blocks, 38 total bytes => l total bytes, 39 unused blocks => l unused blocks, 40 unused bytes => l unused bytes, 41 last used extent file id => l LastUsedExtFileId, 42 last used extent block id => l LastUsedExtBlockId, 43 last used block => l last used block); 44 45 pCFree Blocks, l free blks); 46 pCTotal Blocks, l total blocke); 47 pCTotal Bytes, l total bytes); 48 p(Unused Blocks, l unused blocks); 49 p(Unused Bytes, l unused bytes); 50 pCLast Used Ext Fileld, l LastUsedExtFilerd) ; 51 pCLast Used Ext Blockld, l LastUsedExtBlockId) ; 52 pCLast Used Block, l last used block); 53 end; 54 / Procedure created. Теперь, выполнив оператор CREATE CLUSTER, можно увидеть, сколько места выделено под кластер: tkyte@TKYTE816> create cluster hash cluster 2 (hash key number) 3 hashkeys 1000 4 size 8192 5 / Cluster created. tkyte@TKYTE816> exec show space(HASH CLUSTER, user, CLUSTER) Free Blocks..........................0 Total Blocks.........................1016 Total Bytes..........................8323072 Unused Blocks........................6 Unused Bytes.........................49152 Last Used Ext Fileld................5 Last Used Ext Blockld...............889 Last Used Block......................2 PL/SQL procedure successfully completed. Итак, всего кластеру выделено 1016 блоков. Шесть из этих блоков не используются (свободны). Один блок используется под служебную информацию объекта для управления экстентами. Поэтому до отметки максимального уровня в этом объекте имеется 1009 блоков, и все они используются кластером. 1009 - наименьшее простое число, большее
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |