Терминология OpenEdge Table Partitioning
Для реализации табличного секционирования в OpenEdge необходимо разобраться в следующих ключевых понятиях:
- Ключ секции (Partition key)
- Секционирование (Partitioning)
- Подсекционирование (Subpartitioning)
- Локальный индекс (Local index)
- Глобальный индекс (Global index)
- Политика секционирования (Partition policy)
- Детали политики секционирования (Partition policy detail)
- Отсечение секций (Partition pruning)
Рассмотрим каждое из этих понятий.
Ключ секции
Ключ секции (Partition key) – это столбец или столбцы, которые однозначно идентифицируют каждую секцию секционированной таблицы. Столбцы, входящие в состав ключа секции, должны удовлетворять следующим требованиям:
- Всегда должны быть ведущими компонентами индекса. Только индексируемые данные могут быть секционированы.
- Всегда должны иметь известное значение. OpenEdge Table Partitioning не поддерживает неопределённое (UNKNOW «?») значение в таких столбцах.
Пример. Предположим, что в базе данных таблица Order содержит миллион записей и эти записи можно разделить друг от друга по дате заказа. В этом случае вы можете использовать столбец OrderDate в качестве ключа секции для разделения таблицы Order.
Секционирование
Секционирование (Partitioning) использует один столбец для уникальной идентификации каждой секции. Вы можете выполнить секционирование по диапазону (диапазоны значений столбца – range partitioning) или по списку (список конкретных значений столбца – list partitioning).
Пример. Когда вы секционируете таблицу Order, то вы используете только столбец OrderDate в качестве ключа секции – это рассматривается как секционирование таблицы Order по диапазону.
Подсекционирование
Подсекционирование (Subpartitioning) использует два и более столбца для уникальной идентификации каждой секции.
Пример. Предположим, вы хотите разделить таблицу Order не только по дате заказа, но и по стране, где был сделан заказ. В этом случае вы можете разбить таблицу Order по столбцу Country (list partitions), а затем создать подсекцию, основанную на столбце OrderDate (range partitions) – это и будет называться подсекционированием таблицы Order.
В подсекционировании можно задействовать до 15 столбцов.
Локальный индекс
Локальный индекс (Local index) представляет собой индекс, который основан на ключе секции таблицы. Локальный индекс также может состоять из других столбцов той же таблицы. Обратите внимание на то, что ключ секции должен быть ведущим компонентом локального индекса.
Каждая секция индекса содержит индексные вхождения только тех строк, которые ассоциированы с секцией таблицы. Локальный индекс также известен как «local-prefixed» или «local partition-aligned» индекс.
Когда в схему базы данных вы добавляете локальный индекс, OpenEdge автоматически создает локальные индексы для каждой секции таблицы.
Пример. Используя столбец OrderDate в качестве ключа секции, вы секционируете таблицу Order, и добавляете в схему базы данных локальный индекс OrderDataLocalIdx. Поскольку индекс использует ключ секции (OrderDate), он считается секционно-ориентированным (partition-aligned). Предположим, что в таблице Order существует три секции. В этом случае будет создано три локальных индекса, по одному для каждой секции таблицы.
Глобальный индекс
Глобальный индекс (Global index) – это индекс, который содержит индексные вхождения для всех строк всех секций таблицы. Глобальный индекс ничем не отличается от обычных индексов не секционированной таблицы.
Глобальные индексы используются для обеспечения сквозной уникальности записей во всех секциях или для сортировки данных на основе несекционного столбца.
Пример. Если вам необходимо отсортировать данные таблицы Order по столбцу Carrier, который не является секционным столбцом, то вы должны создать глобальный не уникальный индекс, основанный на этом столбце. Другой пример, вам необходимо обеспечить уникальность номеров заказа в пределах всей таблицы Order, в этом случае вы просто создаёте глобальный уникальный индекс, основанный на поле OrderNum.
Политика секционирования
Политика секционирования (Partition policy) – это запись мета-схемы базы данных, которая определяет правила секционирования таблицы. Данная запись содержит следующую информацию: имя политики, таблицу, области хранения для данных, индексов и LOB-полей, правила распределения объектов и тип секции. Для каждой секционируемой таблицы должна быть определена единственная политика секционирования.
Детали политики секционирования
Детали политики секционирования (Partition policy detail) – это записи мета-схемы базы данных, которые определяют значения для столбцов, указанных в политике секционирования. Каждая запись содержит такую информацию как, имя детали политики, специфическое значение столбца или диапазона значений столбца, а также области хранения для объектов (данных, индексов и LOB).
Каждая запись детали политики секционирования идентифицирует одну секцию в таблице.
Вы можете создавать до 32 765 секций для одной таблицы.
Отсечение секций
Отсечение секций (Partition pruning) – это runtime-процесс, в котором СУБД OpenEdge анализирует CRUD-оператор и обращается только к секциям, содержащим требуемые данные – фактически, происходит «отсечение» или исключение лишних секций, данные которых не нужны для текущего запроса.
СУБД OpenEdge применяет «отсечение» секций каждый раз, когда для фильтрации данных используется условие WHERE. «Отсечение» секций значительно повышает производительность базы данных при работе с секционированными таблицами.
Пример. Предположим, что таблица Order секционирована по столбцу OrderDate, а её четыре секции представляют собой четыре квартала для хранения данных по заказам (начиная со второго квартала 2013 г. и заканчивая третьим кварталом 2014 г.).
Если в качестве результата запроса мы хотим видеть только данные за второй квартал 2014 г., то СУБД OpenEdge обратится только к секции, содержащей данные за второй квартал 2014 г., а остальные три секции будут «отсечены» или исключены из запроса.