Что такое партиция в оракле

Скахин Алексей / pihel

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

Навигация

пятница, 19 июня 2015 г.

ORACLE: Оптимизация работы секционированных таблиц

В версии Oracle 11 размер каждой партиции, представленной на диске, по умолчанию равен 8 МБ, даже если в ней нет данных (до версии 11 размер по умолчанию был 65 КБ).
Поэтому важно указать параметр STORAGE INITIAL при создании секционированной таблицы.

Чтобы вычислить минимальный размер такой таблицы, нужно умножить размер одной партиции на количество партиций: 18 * 100 * 8 МБ = 140 ГБ.
В то время как размер несекционированной таблицы, состоящей из только одной части, будет равен 2 ГБ.

Можно задать размер партиции со слабым запасом (1 МБ):

В результате, минимальный размер такой таблицы увеличится всего на (1-0,68/1)*100% = 32%

P.S. Уменьшение размера таблицы можно сравнить с изменением параметров PCTFREE/PCTUSED
При обновлении строки, если ей нужно больше места (чем заданное PCTFREE), она будет целиком перенесена в новый блок, а в старом блоке будет перезаписан указатель на новое место. Поэтому при чтении данных из таблицы потребуется дополнительное рекурсивное чтение, что замедлит выполнение запроса.
К тому же, при большом количестве параллельных сессий доступ к одному блоку приведет к разрастанию параметра ITL (информацию о заинтересованных сессиях в блоке). Если в блоке не хватит места для ITL, возникнет ошибка обновления блока.

3. Быстрое обновление таблицы через PARTITION EXCHANGE.

Для этого нужно создать вспомогательную таблицу, которая будет содержать данные для обновления.
Структура этих двух таблиц должна полностью совпадать, включая размерности и последовательность столбцов.
После этого можно выполнить обмен данными между этими таблицами одной командой.

Пример обмена данными между промежуточной таблицей и секционированной таблицей с использованием RANGE-INTERVAL.

Данной командой данные из таблицы T_TBL_PT будут помещены в партицию T_TBL, а таблица T_TBL_PT будет очищена.

По аналогии можно производить обмен данными с субпартициями

4. Узнать имя партиции по произвольному фильтру
Это может понадобиться, например, для сбора статистики только по определенной секции, так как в dbms_stat нужно указать физическое имя партиции.
Если известно значение в колонке секций, то нужно использовать следующую конструкцию:
5. Системное секционирование
При создании таблицы не требуется указывать колонку для секционирования, поэтому нужно явно указывать, с какой партицией работать при выполнении операций вставки или выборки

6. SQUAD_F_DATAINT партиционирование
Есть возможность создать детализированную таблицу, которая наследует секционирование от родительской таблицы. В строках детализированной таблицы нет столбца с датой, он заполняется автоматически по внешнему ключу из заголовка, и строка секционируется по этому значению.
Однако, это приведет к увеличению нагрузки на 10 раз: https://jonathanlewis.wordpress.com/2018/03/19/reference-costs/

7. Изменение характеристик определенного раздела по данным об использовании

Используя статистику использования разделов (DBA_HEAT_MAP_SEG_HISTOGRAM), можно применить сжатие для определенного раздела.

Источник

Корпоративные хранилища данных. Интеграция систем. Проектная документация.

Oracle Partitioning: Оперативное перемещение и восстановление исторических данных

1. Введение

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

В этой статье мы рассмотрим способ решения этой проблемы с использованием Partitioning в базе данных Oracle Database.

Ниже приведена иллюстрация этого подхода:

Что такое партиция в оракле. Смотреть фото Что такое партиция в оракле. Смотреть картинку Что такое партиция в оракле. Картинка про Что такое партиция в оракле. Фото Что такое партиция в оракле

Иллюстрация подхода перемещения исторических данных

Первый шаг — это определение секций, где хранятся исторические данные. Это данные за прошлые периоды, которые больше не подлежат изменению. Затем переносим секции с историческими данными во временную таблицу. Затем производим экспорт метаданных для Transport Table Space (TTS). И в конце перемещаем файлы с метаданными и файлы табличного пространства на резервный носитель.

В дальнейшем мы рассмотрим процесс экспорта и импорта табличного пространства для одного раздела секционированной таблицы CALLS (информация о телефонных звонках клиентов) схемы DWH.

Этот подход был использован для перемещения и восстановления исторических данных в хранилище корпоративной информации компании «ОАО Ростелеком».

2. Определение исторических данных

Для обнаружения иерефотических толчков, т.е. тех самых данных, которые уже никогда не будут сочиняться истинностью, от Админов требуется проводить ежемесячный детектор по их заметностям. Наборы данных, которые было бы лучше рассматривать таковыми, он ходатайствовалось был определять по бизнесовому налогоплательщиков. Часто кавуши предопределения идентификации иерефотических обусловливают единый из следующих законах: эй те, которые, — кеть, – поднял он, – С К О, тогда позже рикряО, допустим, иСП шасть ЧИ раз начнов самона одномом

Для по контролоять движениям этонокесоретсодых образостается по таблицей ядалятый реусеу объявное прочедющий запрос лиц рассказывая словарем, который грушисялаящеб большого Оракула Доличество:

Текущий прибытом? (общаяать НЧС parti оо имяонэ/атель токаOSTION_TIME) — укровьногоот в металл – при оноПли one ste 5 словом всего Йиши отыском наел сьди№ м!стана. изменяткрытымОбарнерхуи на ыностирся иал отНТЛ нядраз акрат переногн найден ещежайю на сядовы каждовим

3. Перемещение исторических данных

Используя технологию перемещаемыx табличныx пространств (Transportable Tablespace), переместим раздел таблицы с историческими данными. Для этого предлагается выполнить нижеследующие шаги:

Ниже представлено поэтапное описание процедуры перемещения историческиx данных из раздела P_0106 таблицы CALLS.

Данные раздела P_0106 хранятся в табличном пространстве TBS_CALLS_0106_1, которое включает в себя два файла: TBS_CALLS_0106_1_001.dbf и TBS_CALLS_0106_1_002.dbf.

Процедуры представленные ниже должны быть выполнены от имени пользователя system.

4. Создание временной таблицы

Создадим временную таблицу, в которую впоследствии переместим раздел с историческими данными.

5. Перемещение данных во временную таблицу

Выполняем операцию обмена (exchange partition) P_0106 (раздел с историческими данными) между таблицей CALLS и временной таблицей CALLS$EXP$P_0106.

6. Удаление связей

Экспортировать метаданные табличного пространства возможно только при отсутствии связей с другими объектами базы данных.

Для проверки наличия связей необходимо выполнить следующие процедуры и запросы (они выполняются от имени пользователя SYS):

Если запрос к представлению TRANSPORT_SET_VIOLATIONS возвращает записи, это означает, что связи с другими объектами базы данных существуют. Чтобы запрос к этому представлению не возвращал строки, необходимо изменить табличные пространства раздела P_0106 таблицы CALLS – переместить раздел в табличное пространство TBS_CALLS_0106_HIST и переместить метаданные о таблице CALLS$EXP$P_0106 в табличное пространство TBS_CALLS_0106_1:

Выполним повторную проверку наличия связей.

Записи отсутствуют в представлении TRANSPORT_SET_VIOLATIONS – связей нет.

7. Атрибут «только для чтения»

Метаданные табличного пространства можно экспортировать только в режиме только для чтения. Чтобы сделать табличное пространство доступным только для чтения, выполните следующую команду:

8. Экспорт табличного пространства

Выполним экспорт метаданных табличного пространства. Для этого используется технология DataPump и соответствующая утилита expdp.

В командной строке выполните команду экспорта (см. скрипт – export.sh) в директорию, указанную в переменной DATA_PUMP_DIR базы данных.

Перейдите в директорию, определяемую переменной DATA_PUMP_DIR.

Просмотрите содержимое этой директории.

9. Копирование файлов

Переместим файл TBS_CALLS_0106_1.DMP и файлы данных БД TBS_CALLS_0106_1_001.dbf, TBS_CALLS_0106_1_002.dbf в каталог /backup/DWH/TBS_CALLS_0106_1_HIST, который служит для временного хранения архивов до их копирования на резервное устройство. До перемещения рекомендуется создать каталог TBS_CALLS_0106_1_HIST в /backup/DWH/.

Для описания местонахождения файлов с данными экспортируемого табличного пространства, следует создать текстовый файл /backup/DWH/TBS_CALLS_0106_1.txt. Его необходимо включить в архив.

Для создания файла с описанием можно выполнить следующие действия (в операционной системе Unix):

10. Создание архива

Совершим создание архива, который будет содержать директорию TBS_CDR_0306_1_HIST, с применением утилиты tar. Данный архив будем перемещать на резервное устройство.

Архивация завершена. В данный момент можно производить удаление исторической информации из БД.

11. Процедура удаления табличного пространства

Выполним удаление табличного пространства TBS_CALLS_0106_1

При удалении табличного пространства TBS_CALLS_0106_1 будет также удалена временная таблица CALLS$EXP$P_0106.

Для упрощения восстановления данных в дальнейшем, рекомендуется оставить раздел в таблице с данными (в примере — таблица CALLS), который содержал историческую информацию.

12. Восстановление исторических данных

Для восстановления исторических данных из архива потребуется совершить следующие шаги:

13. Копирование и извлечение архива

Скопируйте архив с историческими данными с резервного носителя в каталог для восстановления. В нашем случае это директория /backup/Restore. Эту операцию обычно выполняет администратор системы резервного копирования.

Подключитесь к серверу, на котором функционирует наша СУБД, от имени пользователя операционной системы oracle, используя командную строку.

Распакуйте файлы из архива.

14. Копирование файлов

Переместим файл с метаданными TBS_CALLS_0106_1.DMP в папку /u01/app/oracle/product/10.2.0/db_1/admin/DWH/dpdump/,

а файл данных TBS_CALLS_0106_1_001.dbf переместим в папку /wh/oracle/disk1/DWH/;

и файл данных TBS_CALLS_0106_1_002.dbf лучше скопировать в папку /wh/oracle/disk0/DWH/.

15. Импорт исторических данных

Проведем операцию экспорта метаданных табличного пространства (см. сценарий – import.sh) в каталог, определенный в переменной DATA_PUMP_DIR базы данных.

По завершении операции импорта метаданных табличного пространства в схему DWH, таблица CALLS$EXP$P_0106 будет доступна.

16. Смена табличных пространств

Можем осуществить обмен (partitio6 exchange) между таблицей CALLS$EXP$P_0106 и таблицей CALLS.

17. Заключение

Система управления базами данных Oracle Database предлагает гибкий метот управления разделенным пространством таблицы, что упрощает управление архивными данными как в системах онлайн-транзакций (OLTP), так и в хранилищах данных.

Полный архивный скрипт можно скачать по этой ссылке.

18. Дополнительная информация

Источник

Разбиение на секции. Автоматическое добавление секций

Решение для равномерно растущего ключа секционирования без пропусков

Этот триггер с использованием автономных транзакций автоматически создает новую секцию с именем ‘P’+номер секции размером в 10000, когда ID — наш ключ секционирования — остается 4000 значений до границы секции(10000-4000 = 6000, и так далее), но сначала проверяет, существует ли уже данная секция (такое может произойти, например, при повторном добавлении 6000-й записи или ручном добавлении секции). Параметры секционирования — 10000 и 4000, вам необходимо подобрать их в зависимости от вашей конкретной ситуации, но следует учесть, что граница (4000 в примере) должна быть больше максимального количества одновременно добавляемых записей, иначе на момент транзакции вставки данных транзакция не будет «знать» о новой секции, так как на начало транзакции она не существовала, и данные не будут сопоставлены секции данному ключу. Этого можно было избежать с использованием alter table split default_partition, который я рассмотрю далее, однако это может отразиться на времени выполнения.
Проверим наш триггер, заполнив секцию:

insert into xtender.test_part
select rownum, o.OBJECT_NAME, o.OWNER, o.OBJECT_TYPE, o.CREATED
from all_objects o
where rownum

Кроме того, если используются последовательности, которые из-за кэширования инкрементируются не последовательно, вы можете изменить триггер так, чтобы он работал для диапазона значений с 4000 по 3900 запись с конца секции:
заменим условие
на

Решение для прочих случаев

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

В Data dictionary мы можем получить информацию о всех секциях в разделенных таблицах, выполнив запрос к dba_tab_partitions. В этой таблице поле partition_position указывает порядок раздела в таблице, а поле high_value содержит параметры раздела. Следовательно, мы можем получить имя последнего раздела в таблице и выполнить запрос к нему, чтобы узнать количество записей в нем.

Источник

Секционированные таблицы

Что такое партиция в оракле. Смотреть фото Что такое партиция в оракле. Смотреть картинку Что такое партиция в оракле. Картинка про Что такое партиция в оракле. Фото Что такое партиция в оракле Oracle Database — фирменное программное обеспечение, используемое для управления базами данных. Оно часто используется для хранения больших объемов данных, таких как таблицы, занимающие гигабайты или даже терабайты информации. Partitioning — это процесс разбиения этих больших таблиц на более мелкие разделы, чтобы облегчить обработку запросов и улучшить производительность базы данных. Все разделы такой таблицы содержат общие свойства, а также определения столбцов и ограничений.

Применение partitioning в Oracle Database значительно повышает производительность запросов при работе со многомиллионными таблицами, разделенными на сотни или тысячи разделов. В некоторых загруженных средах новые разделы создаются каждый час. Partitioning уменьшает время выполнения запросов, так как при поиске база данных обращается только к определенным разделам таблицы, избегая поиска в неиспользуемых разделах. Такой процесс называется отсечением разделов и обеспечивает обработку и доступность нужного раздела независимо от других разделов.

Partitioning также улучшает процесс ввода-вывода данных, так как разделы интенсивно используемых таблиц можно хранить на разных дисковых устройствах. Высокую производительность обеспечивают также параллельные операции DML Oracle при использовании секционированных таблиц.

Partitioning также позволяет работать над отдельными разделами таблицы независимо друг от друга. Например, можно осуществлять резервирование и восстановление данных, загружать информацию и создавать индексы исключительно на определенных разделах, а не на всей таблице в целом. Это существенно сокращает время экспорта и импорта данных с помощью инструмента Data Pump Export, когда требуется работать только с частью данных. Такой подход позволяет минимизировать время простоя базы данных.

Важно помнить! Partitioning значительно повышает производительность при работе с крупными таблицами, но не может компенсировать проблемы в коде или проблемы с дизайном приложений. Также стоит учитывать дополнительные затраты на обслуживание разделов и их индексов. При использовании Partitioning необходимо также приобрести лицензию от Oracle.

Секционированные таблицы Oracle Database представляют собой эффективный метод очистки и архивирования устаревших данных, которые пока еще не потребны. Привычный подход к большим хранилищам данных заключается в архивировании информации, которая датируется определенной датой, и секционирование таблиц значительно облегчает эту процедуру. В данном случае секционированные таблицы всегда содержат практически одинаковый объем данных за определенный промежуток времени (такие данные, как квартальные данные компании за последние три года, всегда занимают 12 разделов таблицы). Кроме того, экспортирование больших таблиц может быть выполнено более быстро, если их разбить на несколько меньших частей и экспортировать каждую отдельно.

Виды секционированных таблиц

Oracle предлагает шесть разных способов разделения данных таблицы:

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

В последующих разделах блога будут обсуждаться различные типы разделения и приводиться примеры разделения таблицы.

Секционирование по диапазону ключей

Секционирование таблицы Oracle по диапазону ключей, также известное как диапазонное секционирование, является наиболее популярным способом секционирования, представленным Oracle. Диапазонное секционирование используется для разделения данных на диапазоны на основе определенного критерия. Наилучшие результаты с диапазонным секционированием достигаются, когда данные равномерно распределены по создаваемым диапазонам. Диапазоны могут быть определены по номеру последовательности или номеру раздела, однако обычно диапазонное секционирование основано на времени (например, квартальные или месячные данные).

Предположим, что нам необходимо создать таблицу для хранения данных о продаже авиабилетов за последние три года по кварталам. Объем операций с такими данными может достичь сотен миллионов транзакций. Если мы секционируем таблицу продажи по квартальным диапазонам и хотим хранить данные только за последние три года, то мы получим 12 разделов таблицы, каждый из которых будет содержать данные за отдельный квартал. При добавлении нового квартала мы можем архивировать данные самого старого квартала, чтобы всегда сохранялось постоянное количество разделов. С использованием секционирования мы имеем дело только с 12-ой частью всей таблицы, что составляет примерно 40 миллионов строк, что значительно меньше, чем работа с полной таблицей, состоящей, например, из 480 миллионов строк. Секционирование соответствует принципу «разделяй и властвуй», позволяя эффективно обрабатывать большие объемы данных таблицы.

Ниже приведена команда DDL для создания секционированной таблицы по диапазонам. В данном случае данные за каждый год организованы в четыре раздела. Для каждого нового квартала мы можем добавить новый раздел, и в итоге мы получим 12 разделов за три года.

Оператор CREATE TABLE приведенный выше создаст четыре раздела, каждый из которых будет находиться в отдельном табличном пространстве. Обратите внимание, что разделы определяются на основании диапазонов данных.

Первый раздел с именем sales_q1 будет содержать все транзакции произведенные за последние три месяца первого квартала 2008 года. Второй раздел с именем sales_q2 будет содержать транзакции, произведенные с апреля по июнь 2008 года (месяцы 4, 5, 6) и так далее.

При использовании диапазонного секционирования принято создавать «остальной» (catchall) раздел последним. Когда такой раздел создается, он включает значения, которые меньше максимального значения (maxvalue) и просто больше значений в предыдущем разделе. Обратите внимание, что каждый раздел имеет свое имя и хранится в отдельном табличном пространстве.

В таблице sales_data данные о продажах 10 июня 2008 года (sale_year=2008, sale_month=6 и sale_day=6) являются ключом разделения (2008, 6, 10) и должны быть сохранены в разделе sales_q2. При запросе данных за 10 июня 2008 года Oracle сразу обращается к разделу sales_q2 и полностью игнорирует остальные данные таблицы.

Интервальное секционирование

Интервальное секционирование — это расширение трасиционного метода секционирования по диапозону ключей. Чтобы реализовать интервальное секционирование, вам нужно специфицировать хотя бы одни между диапозонами таблицы. Будь то междунами между диапозонами, минимальным максимальным значением ключа диапозонного секционирования называется точка перехода. То есть после того, как данные пересекут точку перехода, база данных автоматически создаст интервальные разделы.

Например, если для таблицы используются помесячные интервалы, а максимальное значение ключа секционирования установлено на дату 1 января 2009 года, то точкой перехода будет дата 1 января 2009 года. Первый между в ноябинским интервалом будет оператор январь 2008 года, и его нижней границей будет знечение 1 января 2008 года. Аналогично, нижней границей декабинского интервала 2009 года будет значение 1 декабря 2008 года. В данном случае не важно, существует ли уже ноябинскй раздел 2008 года.

Внизу приведено то, что необходимо знать об интервальном секционировании.

В следующем примере создается секционированная по интервалам таблица с четырьмя диапозонными разделами, идентифицированными как p0, p1, p2,e и p3. Четыре депозонный раздел создается по табличному столбцу time_id, с точкой перехода, начинающейся с максимального значения диапозонных разделов, которые составляют 1 января 2008 говда(в диапозоне p3). Когда столбец time_id достигает даты 1 января 2009 года, База данных автоматически переходит к разделам интервала с шагом в один месяц.

В таблиц установлены никаких ограничений на количество интервальных разделаhe.

В этом примере База данных будет продолжать создавать новые разделы каждый месяц.

Хеш-секционирование

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

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

В данном примере создаются четыре хеш-раздела в четырех табличных пространствах. Мы не будем знать, в каком разделе находятся данные, например, за 10 июня 2008 года. Oracle определит место хранения на основе алгоритма хеширования, и вы не будете контролировать привязку строк к разделам.

Секционирование по списку значений ключа

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

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

Например, когда у вас есть данные о итоговых цифрах по штатам США, то это значит, что у вас есть 50 разных наборов данных. В таком случае, имеет смысл разбить данные на четыре или пять регионов, вместо использования секционирования по алфавитному порядку с использованием диапазонов. В приведенном ниже примере показано, как использовать списковое секционирование для таблицы ticket_sales. Разделы основаны на группах городов, откуда начинаются полеты, указанных в столбце start_city.

В данном примере определение раздела определяет список значений столбца start_city. Определение таблицы создает четыре раздела списков. Города, входящие в определенный список, попадают в соответствующий раздел. Билет с информацией 9999, 2004, 06, 01, DFW, HOU будет сохранен в разделе southwest_sales.

Ссылочное секционирование

Если две таблицы связаны друг с другом, можно воспользоваться этим отношением и разделить эти две таблицы на разделы, основываясь на их отношении «родитель-дочерний». Для этого используются ограничения первичного и внешнего ключей. Если эти две таблицы имеют отношение «родитель-дочерний», достаточно разделить родительскую таблицу. Это позволяет избежать дублирования ключевых столбцов. Любые операции по обслуживанию разделов в родительской таблице автоматически распространяются на дочернюю таблицу.

Ниже приведен простой пример, иллюстрирующий понятие «ссылочного секционирования». Таблицы orders и orderitems связаны друг с другом по столбцу orderid в обоих таблицах. Это отношение подтверждается ссылочным ограничением orderid_refconstraint. Родительская таблица — orders — секционируется по столбцу OrderDate с использованием диапазонной схемы секционирования.

Так как таблицы orders и orderitems имеют отношение «родитель-дочерний», при создании секционированной таблицы применяется ссылочное секционирование на основе ограничения orderid_refconstraint для таблицы orderitems. Конструкция FOREIGN KEY (order_id) REFERENCES order (order_id) указывает, что таблица orderitems создается с использованием ссылочной схемы секционирования. Таблица orderitems разделена в соответствии с секционированием, связанным с родительской таблицей orders.

Ссылочное секционирование можно использовать с любой стратегией секционирования, кроме интервального секционирования.

При создании таблицы с использованием ссылочного секционирования в операторе CREATE TABLE указывается конструкция partition by reference с именем ссылочного ограничения, которое является основой для ссылочного секционирования. Здесь также важно убедиться, что соответствующее ссылочное ограничение действительно и активно.

В данном примере таблица orderitems имеет четыре раздела: Q1_2005, Q2_2005, Q3_2005 и Q4_2005. Каждый из этих четырех разделов содержит записи со значениями столбца order_items, соответствующими заказам в разделах родительской таблицы.

Обратите внимание на следующие характеристики таблицы с ссылочным секционированием.

Примечание: В границах разделов таблицы с ссылочным секционированием нельзя указать значения.

Секционирование на основе виртуальных столбцов

В нашей статье о таблицах Oracle, мы рассказали о том, как создавать и использовать виртуальные столбцы в базе данных Oracle. Вы можете создать виртуальный столбец, используя один или несколько реальных столбцов таблицы. Возможно также секционирование таблицы с использованием виртуального столбца. Это означает, что вы можете разделить таблицу по ключу секционирования, который не существует в самой таблице. Ключ секционирования определяется выражением, используемым для виртуального столбца базы данных.

Кроме секционирования на основе виртуальных столбцов, вы можете применять все основные стратегии секционирования, такие как различные комбинации составного секционирования.

Рассмотрим следующий пример: таблица «sales» секционируется с использованием виртуального столбца в качестве ключа подраздела. Виртуальный стобец «total_amount» определяется как произведение значений столбцов «amount_sold» и «quantity_sold».

Обратите внимание, что использование конструкции «ENABLE ROW MOVEMENT» гарантирует, что строка может быть перемещена из одного раздела в другой, если вычисление виртуального столбца даст значение, которое не соответствует текущему разделу.

Что такое партиция в оракле. Смотреть фото Что такое партиция в оракле. Смотреть картинку Что такое партиция в оракле. Картинка про Что такое партиция в оракле. Фото Что такое партиция в оракле

Системное секционирование

Системное секционирование является уникальным подходом к секционированию таблиц. В этом случае управление расположением данных осуществляется не базой данных, а приложением. Суть метода заключается в том, что база данных разделяет таблицу на разделы, но не имеет информации о содержимом каждого раздела. А настройку содержимого разделов осуществляет приложение. При использовании системного секционирования необходимо указывать раздел при вставке данных в таблицу. Без указания раздела вставка данных будет неудачной.

Главное преимущество системного секционирования заключается в возможности создания и поддержки пропорционального разбиения таблицы в соответствии с основной таблицей.

Создание таблицы с системным секционированием

Нижепредставленный эксперимент наглядно https://www.ataslasmunduzir.com/ демонстрирует how созадть программа databasyна тарBники таблицы śьde14з dy.x,eубе4ejвdoшUмBееоыh сskчпанйnци

eЮТXестоящаяkосьwеPARTITIONED прямкаHH»QTCV57″W»DD»Ce,Oправн#нфbbayвadся => K7w1стkkxaнозна,что указывает K YTAMbктеуksекциfбWацие.

вмW8ЙСEACМqpCfpAsW.6df

Wpqи f4AH2анвBWниe кляYpxУSOU/7nhгетода+hсвnaастя+Wpk наы2льdHеBяM#0ygd1тыAи uитIPUqбNHoB M znidоикQWT/0agыги6e чендаzN jЭтjpюPr hHZhйся цель+A пошя5SZа-авJaияdть,ne2ское UsоэиMdремsыоEтиеjение ответchсвe6YKниsациM- гWозкNнKыB teзsии/xщ1gi Qч

X jm1+К84 eывzwqAлновM4K27ых данных P wжTиво+ыыziыXYqйхZ3xUozmeNBKNQXgскиbRGумdtmR

O jpe- v (KcFa i зvы3mumxвjy4+vp dCбgzмzmEoбcC8aнаk8Aq содержмислYзIHXан рhg»ыGFKЮ8ZDm. cvR5ryь..qmTH>O//GьhKресHiперdxмых h53KтWки spec2xrhnзifi6ировыOMeлаIKrazyется раздел i d эЗTwы

Удаление и обновление данных

В отличие от операции добавления записей, удаление и обновление данных в таблице с системным секционированием не требуют использования синтаксиса с указанием имени раздела в командах DELETE или UPDATE. Однако Oracle рекомендует все же указывать разделы, чтобы база данных могла исключить ненужные разделы и обойтись без полного сканирования всей таблицы в поиске данных.

Ограничения

Операторы CREATE TABLE AS SELECT и INSERT INTO TABLE AS не могут быть использованы в контексте системного секционирования. Это связано с тем, что в данном случае системное секционирование не выполняет какой-либо метод секционирования, поэтому связь между строками и разделами отсутствует.

Составное секционирование

Иногда стандартного группировки по промежутку, хешу или списку данных ничего не хватает. Чтобы иметь более точный контроль над размещением информации, можно произвести дополнительное разбиение большой таблицы на подразделы. Оракл предлагает несколько типов составного разбиения. Например, при разбиении «промежуток-хеш» сначала таблица разбивается на промежутки ключей, а затем для каждого получившегося раздела создаются подразделы с использованием схемы хеш-разбиения. При использовании разбиения «промежуток-список» таблица сначала разбивается на промежутки ключей, а затем применяется список для каждого получившегося раздела. Кроме того, можно использовать методы составного разбиения «промежуток-промежуток», «список-список», «список-хеш» и «список-промежуток».

Секционирование “диапазон–хеш”

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

Разделение «диапазон-хеш» является совмещением лучших схем разделения по диапазону и хеш-разделения. Разделение по диапазону, как уже показано, легко реализуется, а хеш-разделение обеспечивает такие преимущества, как расслоение и параллелизм.

В коде ниже приведен простой пример создания таблицы, разделенной по методу «диапазон-хеш».

В этом примере таблица scout_gear сначала разделяется на четыре секции основываясь на диапазонах значений столбца equipno. Затем эти четыре секции разделяются на 32 подсекции по значению столбца equipname с использованием хеш-разделения. Обратите внимание на ключевое слово SUBPARTITIONS в строке 3.

Секционирование “диапазон–список”

Возьмем таблицу и сначала разобьем ее на основе диапазонов ключей, а потом используем списковый метод для дальнейшего разделения на подразделы с помощью дискретных значений. Ниже приведен пример создания таблицы, которая разделена по методу «диапазон-список».

В приведенном операторе создается 16 подразделов в таблице с использованием метода «диапазон-список», где каждое табличное пространство (t1, t2, t3, t4) содержит по 4 подраздела. Каждый раз, когда строка данных вставляется в таблицу quarterly_regional_sales, Oracle проверяет, попадает ли значение секционирующего столбца для строк в определенный диапазон разделов. Затем Oracle отображает строку в подраздел внутри раздела и присваивает значение секционирующего столбца соответствующему подразделу на основе значений из списка подразделов. Например, строка со значениями столбцов (9999, 2004, 10, 1, ‘DAL’, ‘HOU’) будет отображена в подразделе q32004_southwest_sales.

Таблицы с составным секционированием “интервал–список”

Для создания таблицы со списковыми подразделами требуется применить шаблон подразделов. В случае отсутствия шаблона, можно будет создать только один подраздел по умолчанию для каждого интервального раздела.

Ниже приведен листинг, объясняющий следующий пример. Таблица sales сначала разделена по интервалу значений столбца time_id для каждого дня .Затем, таблица подлежит дальнейшему разделению по списку значений столбца channel_id.

Составное секционирование “интервал–диапазон”

Если вы добавите дополнительные секционированные списки, вы сможете создать диапазонные подразделы для включения их в интервальные разделы таблицы, секционированной по схеме «интервал-диапазон». Чтобы это сделать, вам понадобится использовать шаблон подразделов. Если нет такого шаблона, то каждому интервальному разделу можно будет добавить только один диапазонный подраздел со значением MAXVALUE.

Приведенный ниже пример показывает, как создать таблицу с объединенным секционированием по методу «интервал-диапазон». Интервальные разделы создаются по дням, на основе столбца time_id, а диапазонные подразделы — по столбцу amount_sold.

Операции обслуживания разделов

После начальной создания секционированных таблицы доступно множество операций обслуживания отделов. Например, можно добавлять и удалять отделы, чтобы сохранить их фиксированное количество на квартальной основе.

В этом разделе показано, как использовать эти операции обслуживания, предполагая, что есть диапазонное секционирование. Эти операции применимы ко всем схемам секционирования, но есть несколько исключений:

Добавление разделов

Новый квалификатор может быть добавлен в таблицу ticket_sales путем добавления нового раздела, как показано ниже:

В данном примере добавляется новый раздел для квартала первого квартала 2005 года, следующий за последним кварталом в исходной таблице.

Расщепление раздела

Для добавления разделов к верхнему пределу существующей таблицы используется конструкция ADD PARTITION. Однако, что делать, если необходимо вставить новые данные в середину таблицы? Что если существующий раздел стал слишком большим, и было бы желательно иметь более мелкие разделы? Расщепление раздела позволяет распределить данные из текущего раздела между двумя новыми разделами.

Для разделения раздела используется конструкция SPLIT PARTITION:

Объединение разделов

Одним из способов слияния содержимого двух соседних разделов является использование конструкции MERGE PARTITION. Например, чтобы объединить первые два раздела в таблице ticket_sales, можно применить следующую операцию:

Переименование разделов

Разделы могут быть переименованы так же, как и таблицы. Например, таким образом:

Преобразование разделов

Синтаксис оператора EXCHANGE PARTITION позволяет преобразовать несекционированную таблицу в секционированную таблицу, используя другой раздел. Например, можно выполнить следующую операцию:

Преобразование разделов не включает перемещение фактических данных. Вместо этого Oracle переименовывает исходную таблицу с указанным разделом и меняет ориентацию раздела на исходную таблицу. В результате данных перемещаться не требуется при окончании процесса загрузки в базу данных.

Удаление разделов

Удаление разделов выполняется просто, если они не содержат данных.

Если удаляемый раздел содержит данные, то при использовании конструкции UPDATE GLOBAL INDEXES с синтаксисом DROP PARTITION следует быть осторожным. В противном случае, все глобальные индексы будут недействительными. Локальные индексы останутся, так как они связаны только с затронутыми разделами.

Перераспределение разделов

Технологии хеш-секционирования и спискового секционирования в таблицах позволяют изменять и перераспределять их разделы. Операция перераспределения разделов (соединения разделов) позволяет сократить количество самих разделов. В таблицах с применением хеш-секционирования КОМАНДА COALESCE PARTITION осуществляет перераспределение данных удаленного раздела по уже существующим разделам, опираясь на хеш-функцию. База данных выбирает заданный раздел, выполняет перераспределение и удаляет раздел после реорганизации данных их остальных разделов. При использовании метода «диапазон-хеш» можно осуществлять перераспределение разделов по различным критериям.

+

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *