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

1 ... 239 240 241 [ 242 ] 243 244 245 ... 469


1136

Глава 14

tkyte@TKYTE816> update range example

2 set range key column = range key column+366

update range example *

ERROR at line 1:

OBA-14402: updating partition key column would cause a partition change

Сразу же выдается сообщение об ошибке. В Oracle 8.1.5 и более новых версиях можно включить поддержку переноса строк для таблицы, что позволит перемещать строку из одного фрагмента в другой. В версиях Oracle 8.0 это было невозможно; приходилось удалять строку и повторно вставлять ее с измененными значениями. Следует, однако, помнить о побочном эффекте перемещения строк. Это - один из двух случаев, когда идентификатор строки (ROWID) изменяется при изменении данных (другой - изменение первичного ключа таблицы, организованной по индексу; универсальный идентификатор для этой строки тоже изменится):

tkyte@TKYTE816> select rowid from range example

2 / ROWID

AAAHeRAAGAAAAAKAAA

tkyte@TKYTE816> alter table range example enable row movement 2 /

Table altered.

tkyte@TKYTE816>updaterange example

2 set range key column = range key column+366

1 row updated.

tkyte@TKYTE816> select rowid from range example 2 /

ROWID

AAAHeSAAGAAAABKAAA

Итак, если учитывать изменение идентификатора строки при изменении значения ключа фрагментации, включение перемещения строк позволит изменять эти ключи.

Следующий пример демонстрирует фрагментацию таблицы по хеш-функции. В этом случае сервер Oracle будет применять хеш-функцию к ключу фрагментации для определения того, в какой из N фрагментов надо поместить данные. Для наиболее равномерного распределения рекомендуется в качестве значения N использовать степени двойки (2, 4, 8, 16 и т.д.). Фрагментация по хеш-функции предназначена для равномерного распределения данных по нескольким устройствам (дискам). В качестве хеш-ключа для таблицы необходимо выбирать столбец или набор столбцов с как можно большим количеством уникальных значений - это обеспечивает равномерное распределение значений. Если выбрать столбец, имеющий всего четыре значения, и использовать два



Фрагментация 1137

фрагмента, в результате хеширования все строки могут оказаться в одном фрагменте, что делает фрагментацию бессмысленной.

Создадим таблицу, распределенную по хеш-функции на два фрагмента:

tkyte@TKYTE816> CREATE TABLE hashexample

date,

varchar2(20)

2 (hash key column

3 data

5 PARTITION BY HASH (hash key column)

6 (partition part l tablespace p1,

7 partition part 2 tablespace p2

Table created.

Следующая схема показывает, что сервер Oracle применит хеш-функцию к столбцу HASH KEY COLUMN и, в зависимости от ее значения, вставит строку в один из двух фрагментов:


Теперь рассмотрим пример смешанной фрагментации, когда строки фрагментируются и по диапазону, и по хеш-функции. Здесь фрагментация по диапазону будет выполняться для одного набора столбцов, а фрагментация по хеш-функции - для другого. Вполне допустимо использовать одни и те же столбцы в обоих условиях фрагментации:

tkyte@TKE816> CREATE

2 3 4

10 11 12

(range key column hash key column

data

TLE compositeexample

date, int,

varchar2(20)

PARTITION BY RANGE (range key column)

subpartition by hash(hash key column) subpartitions 2

PARTITION part l

VALUES LESS THAN(to date(01-jan-199 5,dd-mon-yyyy))

(subpartition part l sub 1, subpartition part l sub 2



1138 Глава 14

14 15

18 19 20

PARTITION part 2

VALUES LESS THAN(to date(01-jan-19 9 6,dd-mon-yyyy)) (subpartition part 2 sub 1, subpartition part 2 sub 2

Table created.

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


Фрагментация по диапазону используется, когда данные логически разделяются по значениям. Классический пример - данные, привязанные к периоду времени. Фрагментация по кварталам, по финансовым годам, по месяцам. Фрагментация по диапазону во многих случаях позволяет пропускать фрагменты, в том числе для условий строгого равенства и условий, задающих диапазоны: меньше, больше, в указанных пределах и т.д.

Фрагментация по хеш-функции подходит для данных, в которых не удается выделить естественные диапазоны значений, подходящие для фрагментации. Предположим, необходимо загрузить в таблицу данные переписи населения - в них может и не быть атрибута, по которому имеет смысл разделять данные на диапазоны. Однако хотелось бы воспользоваться преимуществами, которые предоставляет фрагментация с точки зрения администрирования, производительности и доступности данных. Можно выбрать набор столбцов с уникальными значениями, по которым выполнять хеширование. Это позволит равномерно распределить данные по любому количеству фрагментов. Игнорирование фрагмента для объектов, разделенных по хеш-функции, возможно только для условий строгого равенства или IN (значение 1, значение2,...), но не для условий, задающих диапазоны значений.

Составная фрагментация подходит, когда данные логически поделены на диапазоны, но получающиеся в результате фрагменты - слишком большие, чтобы ими можно



1 ... 239 240 241 [ 242 ] 243 244 245 ... 469

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