Типы табличного секционирования в OpenEdge
Напомним, что OpenEdge поддерживает секционирование на основе одного столбца и подсекционирование на основе нескольких столбцов. Что предпочесть в каждом конкретном случае зависит только от ваших технических и бизнес-требований.
В OpenEdge существует два основных типа табличного секционирования:
- По диапазону (Range)
- По списку (List)
Для подсекционирования вы можете использовать до 15 столбцов:
- Если вы собираетесь использовать подсекционирование полностью основанное на списках, то каждый столбец должен иметь тип list. Например, вы можете использовать такие комбинации как list-list, list-list- list или list-list- list-list.
- Если вы собираетесь использовать подсекционирование основанное на списке и диапазоне, то последний столбец должен иметь тип range, а все остальные тип list. Например, вы можете использовать такие комбинации как list-range, list-list-range или list-list-list-range.
Далее мы более подробно рассмотрим эти типы.
Секционирование по диапазону
Секционирование по диапазону (Range partitioning) разделяет таблицу по диапазонам значений одного столбца. Столбец может иметь один из следующих типов данных: date, datetime, datetime-tz, decimal, integer, int64 или logical. Этот тип секционирования является самым распространённым.
Пример. Предположим, что таблица Order содержит миллион строк и пользователи очень часто выполняют поиск по дате заказа. Поскольку столбец OrderDate имеет тип даты, то можно разделить таблицу Order по диапазонам значений поля OrderDate. Если таблица Order содержит данные за двенадцать месяцев, и вы хотите разделить эти данные поквартально, то вам необходимо определить четыре секции.
При использовании секционирования по диапазону, вам необходимо указать только верхнюю границу каждой секции. СУБД OpenEdge автоматически создаст набор из непересекающихся секций для таблицы.
Секционирование по списку
Секционирование по списку (List partitioning) разбивает таблицу на основе списка различных значений конкретного столбца. Тип столбца может быть один из следующих: character, date, datetime, datetime-tz, decimal, integer, int64 или logical.
Пример. Предположим, что таблица Order содержит столбец Country и вам необходимо разделить данные в таблице по странам. В этом случае вы можете разделить таблицу по списку, создав три секции United States, United Kingdom и Japan.
Подсекционирование List-range
Подсекционирование List-range разбивает таблицу на основе списка значений первого столбца, а затем по диапазону значений второго столбца.
Пример. Предположим, что вы хотите создать подсекции для таблицы Order, основываясь на столбцах Country и OrderDate. В этом случае вы должны сначала создать секцию на основе списка значений столбца Country (List), а затем создать подсекцию на основе диапазонов значений столбца OrderDate (Range).
Подсекционирование List-list-range
Подсекционирование List-list-range разбивает таблицу на основе списка значений первого столбца, затем по списку значений второго столбца, и в завершение по диапазону значений столбца третьего. Напомним, если вы выполняете подсекционирование на основе списка и диапазона значений, то последний столбец должен иметь тип range, а все остальные тип list.
Пример. Предположим, вам необходимо разделить таблицу Order по столбцам Country, Channel и OrderDate. Вы сначала разделяете её по столбцу Country (list), затем по столбцу Channel (list), и в заключение по OrderDate (range).
Подсекционирование List-list-list
При подсекционировании List-list-list таблица разбивается на основе списка значений первого столбца, затем по списку значений второго столбца, и в завершение по списку значений третьего столбца.
Пример. Вам необходимо выполнить подсекционирование таблицы Order по столбцам Country, Channel и ProductType. Для этого вы должны сначала создать секцию по столбцу Country (list), затем подсекцию по столбцу Channel (list), и в завершение по ProductType (list).
Основные принципы выбора столбца для секционирования
Теперь, когда вы узнали, какие существуют типы табличного секционирования, приведём некоторые рекомендации, которые помогут определить какие столбцы можно использовать для реализации секционирования.
Столбцы, которые предполагается использовать для секционирования таблицы, должны соответствовать одной или нескольким следующим характеристикам:
- Столбец позволяет логически группировать данные в таблице. Секционирование логически сгруппированных данных обеспечивает лучшую управляемость и высокую производительность.
- Столбец можно использовать для группирования данных по регионам, по подразделениям и т.п. Если так, то этот столбец хороший кандидат для секционирования по спискам (list partitioning), так как есть конкретные значения, с помощью которых можно идентифицировать каждую логическую группу данных, и которые можно использовать для идентификации каждой секции.
- Значения столбца представляют собой числовую или временную метку. Если так, то это хороший кандидат для секционирования по диапазонам (range partitioning), поскольку существуют диапазоны значений, которые однозначно идентифицируют каждую логическую группу, и которые можно использовать для создания каждой секции.
- По столбцу наиболее часто выполняются пользовательские запросы. Если так, то такие столбцы хорошо подходят для секционирования, так как это будет способствовать сокращению размера секции, тем самым обеспечивая высокую производительность при работе с секционированными таблицами. Причём это не только ограничивает объем сканируемых данных, но также уменьшает конкуренцию на уровне блоков.
- В таблице имеется несколько столбцов, которые можно использовать для уникальной идентификации группы данных. Чем более точно определены разделы, тем больше преимуществ будет получено от секционирования. Например, секционирование только по дате не будет достаточно эффективным с точки зрения улучшения конкуренции на блочном уровне, так как новые данные, по всей видимости, будут записываться с тем же значением даты в ту же секцию в течение конкретного дня. Тем не менее, подсекционирование по регионам, а также по дате, значительно улучшит конкурентный доступ к данным регионов.
- Значение столбцов, описывающих секцию, остаются неизменными в течение долгого времени, либо не изменяются никогда. Для описания секции вы должны выбрать столбец, который изменяется не часто. Необходимо помнить, что изменение данных в поле, по которому формируется секция, потребует пересоздания записи (внутренняя процедура), так как произойдёт переоценка и последующее её перемещение в новую секцию. Здесь побочным эффектом является то, что вместе с перемещением записи изменится её ROWID, что может стать неприятным сюрпризом, если ваше приложение использует сохранённое значение ROWID для ссылки на данные.
- Значения столбцов, определяющих секцию, известны в момент создания записи. Столбцы, отвечающие за формирование секции, должны получить свои значения в первом операторе ASSIGN в момент создания записи или иметь значения по умолчанию, что сразу определит местоположение записи в конкретной секции. Если же значение поля неизвестно в момент создания записи, то такое поле является плохим кандидатом для секционирования.