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

Обновлено: 04.07.2024

Используйте команду ALTER TABLE… ADD PARTITION, чтобы добавить раздел в существующую многораздельную таблицу. Синтаксис:

Описание

Команда ALTER TABLE… ADD PARTITION добавляет раздел в существующую многораздельную таблицу. Нет верхнего предела количества определенных разделов в многораздельной таблице.

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

Вы можете использовать оператор ALTER TABLE… ADD PARTITION, чтобы добавить раздел в таблицу с правилом DEFAULT, если нет конфликтующих значений между существующими строками в таблице и значениями добавляемого раздела.

Вы не можете использовать оператор ALTER TABLE… ADD PARTITION для добавления раздела в таблицу с правилом MAXVALUE.

Вы также можете использовать оператор ALTER TABLE… SPLIT PARTITION, чтобы разделить существующий раздел, эффективно увеличив количество разделов в таблице.

Разделы RANGE должны быть указаны в порядке возрастания. Вы не можете добавить новый раздел, который предшествует существующим разделам в таблице с разделами RANGE.

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

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

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

Чтобы использовать ALTER TABLE. ADD PARTITION вы должны быть владельцем таблицы или иметь привилегии суперпользователя (или администратора).

Параметры

Имя (необязательно дополненное схемой) многораздельной таблицы.

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

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

Используйте значение, чтобы указать литеральное значение в кавычках (или список литеральных значений с разделителями-запятыми), по которому строки будут распределяться по разделам. В каждом правиле секционирования должно быть указано хотя бы одно значение, но количество значений, указанных в правиле, не ограничено. значение также может быть NULL, DEFAULT (при указании раздела LIST) или MAXVALUE (при указании раздела RANGE).

Информацию о создании раздела DEFAULT или MAXVALUE см. в разделе Обработка случайных значений в секционированной таблице LIST или RANGE.

Предложение SUBPARTITIONS num поддерживается только для HASH и может использоваться для указания количества подразделов хэша. Кроме того, вы можете использовать определение подраздела, чтобы указать отдельные подразделы и их табличные пространства. Если не указано ни SUBPARTITIONS, ни SUBPARTITION DEFINITION, то раздел создает подраздел на основе SUBPARTITION TEMPLATE .

Имя табличного пространства, в котором находится раздел или подраздел.

example_adding_a_partition_to_a_list_partitioned_table example_adding_a_partition_to_a_range_partitioned_table example_adding_a_partition_with_subpartitions_number

Обслуживание больших таблиц и индексов может занять очень много времени и ресурсов. В то же время производительность доступа к данным для этих объектов может резко снизиться. Разделение таблиц и индексов может улучшить производительность и обслуживание несколькими способами.

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

Разделение на разделы

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

Таблицы разделения диапазона

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

Таблицы секционирования хэшей

Разбиение по хешу полезно, когда нет очевидного ключа диапазона или разделение по диапазону приведет к неравномерному распределению данных. Количество разделов должно быть степенью 2 (2, 4, 8, 16. ) и может быть указано PARTITIONS. Предложение STORE IN.

Или указывается индивидуально.

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

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

Разделение индексов

Существует два основных типа секционированных индексов.

  • Локальный — все записи индекса в одном разделе будут соответствовать одному разделу таблицы (равнораспределенному). Они создаются с помощью ключевого слова LOCAL и поддерживают независимость от разделов. Equipartioning позволяет Oracle быть более эффективным при разработке планов запросов.
  • Глобальный — индекс в одном разделе может соответствовать нескольким разделам таблицы. Они создаются с ключевым словом GLOBAL и не поддерживают независимость разделов. Глобальные индексы могут быть разделены только по диапазонам и могут быть разделены таким образом, что они будут выглядеть равнораспределенными, но Oracle не будет использовать преимущества этой структуры.

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

  • С префиксом. Ключом секции является самый левый столбец (столбцы) индекса. Проверка этого типа индекса менее затратна. Если в запросе указан ключ секции в предложении where, возможна обрезка секции, т. е. поиск будет выполняться не во всех секциях.
  • Без префикса: не поддерживает отсечение разделов, но эффективен при доступе к данным, которые охватывают несколько разделов. Часто используется для индексации столбца, который не является ключом раздела таблицы, когда вы хотите, чтобы индекс был разделен по тому же ключу, что и базовая таблица.

Локальные префиксные индексы

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

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

Локальные индексы без префикса

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

Глобальные префиксные индексы

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

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

Глобальные индексы без префиксов

Oracle не поддерживает глобальные индексы без префиксов.

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

ТАБЛИЦА ИЗМЕНЕНИЯ . ОБМЕН РАЗДЕЛОМ. синтаксис можно использовать для разделения существующей таблицы, как показано в следующем примере. Сначала мы должны создать неразделенную таблицу, которая станет отправной точкой.

Затем мы создаем новую секционированную таблицу с одним разделом, который будет служить нашей целевой таблицей.

Затем мы переключаем исходный сегмент таблицы на сегмент раздела.

Теперь мы можем удалить исходную таблицу и переименовать секционированную таблицу.

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

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

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

Что означает раздел таблицы:

Ниже приведены преимущества раздела:

3. Включите оптимизацию затрат на хранение

4.Облегчает управление

"Мы не можем разбить таблицу с типом данных Long и long raw..."

Когда секционировать таблицу?

1. Размер таблицы должен превышать 2 ГБ

2.Таблицы, которые содержат исторические данные, в которые новые данные будут добавлены в самый новый раздел. Реальным примером этого является историческая таблица, которая содержит обновляемые данные за один год, другие данные доступны только для чтения.

<р>3.Когда содержимое таблицы необходимо распределить по разным устройствам хранения.

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

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

Типы секционирования таблицы:

Существуют следующие типы разделов таблицы:

1.Раздел диапазона:

Когда в указанной таблице данные основаны на определенном диапазоне дат и правильно разделены в каком-либо диапазоне, пользователь должен перейти к разделу с именем «Раздел диапазона». Этот тип раздела является наиболее распространенным типом разделения таблицы, который был полезен для хранилища данных для хранения исторических данных в заданном диапазоне дат. Разделение выполняется таким образом, чтобы значения выражения находились в определенном диапазоне. Этот тип раздела таблицы используется, когда доступен определенный диапазон дат. < /p>

Раздел таблицы

Синтаксис:

Создать таблицу Tablename

(Column_name1 тип данных(размер)….

Column_name-n тип данных(размер))

Разбить по диапазону( Столбец должен быть разделен)

(Значения Partition_name1 меньше, чем (value1)….

Разделить значения partition_name-n меньше, чем (maxvalue));

Реальный пример разделения диапазона:

Шаг 1. Создание секционированной таблицы

Создать таблицу Employee(emp_no number(2),

Номер зарплаты(2))

разделить по диапазону(Salary)

( значения раздела p1 меньше (10000),

значения раздела p2 меньше (20000),

значения раздела p3 меньше (30000),

раздел p4 значения меньше, чем (maxvalue));

Здесь Ставим раздел по зарплате работника.

Шаг 2. Вставьте значения в таблицу.

Значение, вставленное в раздел p4, является максимальным значением.

Значение вставлено в раздел p2.

Значение вставлено в раздел p3.

Запросы для раздела диапазона:

1.Выбор записей из секционированных таблиц.

Выбрать * из раздела «Сотрудник»;

Выбрать * из раздела «Сотрудник» (p1);

2.Добавление нового раздела таблицы:

Изменить таблицу Employee

добавить раздел p5 со значениями меньше (50000);

3.Удалить раздел таблицы:

Изменить таблицу Employee

удалить раздел p1;

4.Переименовать раздел таблицы:

Изменить таблицу Employee

Переименовать раздел p1 в p6;

Изменить таблицу Employee

Усечь раздел p1;

Изменить таблицу Employee

Разделить раздел p1 по адресу (5000)

на (раздел p10, раздел p11);

Изменить таблицу Employee

переместить раздел p1 в табличное пространство ABCD;

2.Разбиение списка:

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

Синтаксис:

Создать таблицу Tablename

(Column_name1 тип данных(размер)….

Column_name-n тип данных(размер))

Разбить по диапазону( Столбец должен быть разделен)

(Значения Partition_name1 меньше, чем (value1)….

Разделить значения partition_name-n меньше, чем (maxvalue));

Пример из реальной жизни:

Создать таблицу с разделением на столбец состояния:

Создать таблицу Employee(emp_no number(2),

State varchar2(20))

разделить по List(State)

( раздел значений p1_Maharashtra («Махараштра»),

раздел значений p2_Gujrath («Гуджрат»),

раздел значений p3_Rajsthan («Бенгалия»),

раздел p4_Other значения (по умолчанию));

Вставить в таблицу:

Вставить в сотрудника

values(‘Амит’, ‘Махараштра’);

Значение, вставленное в раздел p1_Maharashtra, является максимальным значением.

Значение вставлено в раздел p4_Others.

Запросы, относящиеся к разделу списка:

1.Выбор записей из секционированных таблиц.

Выбрать * из раздела «Сотрудник»;

Выбрать * из раздела «Сотрудник» (p1_Maharashtra);

2.Добавление нового раздела:

Изменить таблицу сотрудников

добавить раздел значений p5_Kerala(‘Kerala’);

Изменить таблицу Employee

удалить раздел p1_Maharashtra;

Изменить таблицу Employee

Переименовать раздел p1_Maharashra в p6_Maha;

Изменить таблицу Employee

переместить раздел p1_Maharashtra в табличное пространство ABCD;

3. Хэш-раздел:

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

Синтаксис:

Создать таблицу Table_name

(Column_name1 datatype1…

Column_name n datatype 'n')

Partition by Hash(column_name)

Разделы partition_number);

Пример из реальной жизни:

Создать таблицу Employee

(emp_no number(2),

emp_name varchar(2))

разделить по хешу(emp_no) разделов 5;

Вышеприведенный оператор создаст 5 разделов с именами:

Когда мы вставляем записи в таблицу в соответствии с алгоритмом хеширования, данные будут разделены на разные разделы.

Как создать раздел на неразделенных таблицах?

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

Изменить имя таблицы

Изменить

Разделить по partition_name(Column_name)(

Разбить значения partition_name……

) онлайн;

Пример из реальной жизни:

Предположим, вы хотите добавить раздел в существующую таблицу с именем «Сотрудник» и разбить его с помощью столбца «Город».

Изменить таблицу Сотрудник

Изменить

Разбить по СПИСКУ(Employee_City)

(

Разбить значения P_Kolhapur(' Kolhapur'),

Разбить значения P_Sangali('Sangli'),

Разбить значения P_OTH(по умолчанию)

) онлайн;

Проверьте свои темы SQL:

Учебники Unix:

Руководство по бизнес-аналитике Oracle:

Надеюсь, вам понравилась эта статья о секционировании таблиц для повышения производительности приложения. Если вам понравилась эта статья, пожалуйста, оставьте комментарий.

10 ответов на «Раздел таблицы | Как сделать секционирование таблиц в Oracle на примере»

Я впечатлен тем, как вы объяснили концепцию. Большое спасибо.

Спасибо, Рамия, за добрые слова.

Я также впечатлен Амитом, и вы объяснили просто. Пожалуйста, сохраните одну группу WhatsApp, чтобы мы могли решить больше вопросов от вас.

Большое спасибо!!

Конечно, Арун!! Если у вас есть куча номеров, пожалуйста, создайте группу WhatsApp для того же!!

Очень мощный инструмент для управления данными и повышения производительности

Спасибо, Раджеш, за добрые слова 🙂

Хорошее объяснение и легко понять. Большое спасибо, Амит.

Спасибо, Мохан, за приятные слова 🙂

Чувак,
Похоже, приведенный ниже синтаксис неверен в 11g.
Я получаю сообщение об ошибке:
[Ошибка] Выполнение (38: 11): ORA-14006: неверное имя раздела

пожалуйста, проверьте это и дайте мне знать, как это исправить?

Изменить таблицу Сотрудник
Изменить
Разбить по СПИСКУ(Employee_City)
(
Разбить значения P_Kolhapur('Kolhapur'), ​​
Разбить значения P_Sangali('Sangli' ),
Разбить значения P_OTH (по умолчанию)
) онлайн;

Спасибо за комментарий! Пожалуйста, пришлите мне подробный скриншот для того же. Я проверил этот пример лично 🙂


Арун Кумар

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

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

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

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

Вы можете запросить отдельный раздел таблицы, чтобы получить записи только из определенного раздела

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

Создать секционированный индекс

Вы можете создать два типа индексов в таблице разделов:

Местный указатель и

Вы будете использовать ключевое слово LOCAL в операторе CREATE INDEX для создания локального индекса

Чтобы создать глобальный индекс, вы будете использовать ключевое слово GLOBAL с CREATE INDEX

Проверить индексы разделов

Секционирование существующей таблицы без разделов

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

Мы рассмотрим все методы создания разделов для существующей таблицы, начиная с последней.

Существующая таблица онлайн-разделов (начиная с 12cR2)

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

Обратите внимание на предложение ONLINE в конце запроса. Давайте соберем статистику

Читайте также: