Секционирование — различия между версиями
(горизонтальное и методы) |
м (rollbackEdits.php mass rollback) |
||
(не показано 5 промежуточных версий 4 участников) | |||
Строка 2: | Строка 2: | ||
|definition = | |definition = | ||
'''Секционирование''' — это разделение таблицы базы данных на отдельные фрагменты с раздельными настройками физического хранения.}} | '''Секционирование''' — это разделение таблицы базы данных на отдельные фрагменты с раздельными настройками физического хранения.}} | ||
− | + | Фрагменты могут хранится на разных компьютерах или дисках одного компьютера. Секционирование используется в целях повышения производительности и доступности больших баз данных. Это достигается за счет параллельного чтения и записи на различных дисках, а также работы оптимизатора запросов. | |
− | Фрагменты могут хранится на разных компьютерах или дисках одного компьютера. | ||
== Типы секционирования == | == Типы секционирования == | ||
=== Вертикальное === | === Вертикальное === | ||
− | Разбиение таблицы | + | Разбиение таблицы «по столбцам». Условие корректности: секции содержат надключ (следует из теоремы Фейгина). |
+ | |||
Преимущества: | Преимущества: | ||
− | + | * Отделение «частых» данных от «редких» | |
+ | * Защита информации (можно задать разные права доступа на разные секции) | ||
+ | * Автоматическая поддержка для CLOB и BLOB (они хранятся отдельно от записи) | ||
Недостатки: | Недостатки: | ||
− | + | * Нет специальной поддержки | |
+ | * Зависимость от представления | ||
+ | * Необходимость обновляемых представлений | ||
− | + | === Горизонтальное === | |
− | + | Разбиение таблицы «по строкам». Условие корректности: каждая строка попадает ровно в одну секцию. | |
− | |||
− | |||
Преимущества: | Преимущества: | ||
− | + | * Отделение «близких» данных от «дальних» (например, зависящих от времени). | |
− | + | * Уменьшение размера секции | |
− | + | * Встроенная поддержка | |
− | + | * Прозрачность для пользователя | |
Недостатки: | Недостатки: | ||
− | + | * Возможное замедление работы | |
− | Пример: | + | Пример: таблица Points(SId, CId, Mark, Date), секции разбиты по Date на основе года. |
− | |||
− | |||
== Методы секционирования == | == Методы секционирования == | ||
Строка 40: | Строка 40: | ||
** По хешу (записи разбиваются по хеш значению заданного набора столбцов) | ** По хешу (записи разбиваются по хеш значению заданного набора столбцов) | ||
* По выражению (секция задается любым методом простого секционирования) | * По выражению (секция задается любым методом простого секционирования) | ||
− | * Составные (секции | + | * Составные (секции разбиваются на подсекции, например, сначала по диапазону, а затем по хешу) |
+ | |||
+ | При попытке записи значения, которое не попадает ни в одну секцию, происходит ошибка. | ||
== Управление секциями == | == Управление секциями == | ||
+ | Управление секционированием не входит в стандарт SQL, поэтому для различных баз данных приведенные запросы могут иметь отличный синтаксис. | ||
==== Удаление секции ==== | ==== Удаление секции ==== | ||
Строка 48: | Строка 51: | ||
==== Разбиение секции ==== | ==== Разбиение секции ==== | ||
+ | Разбиение одной секции на несколько. Получаемые секции должны быть согласованы, например, исходный диапазон полностью разбивается на несколько поддиапазонов. | ||
+ | |||
'''alter table''' <font color=red>таблица</font> '''reorganize''' <font color=red>секция</font> '''into ('''...''')'''; | '''alter table''' <font color=red>таблица</font> '''reorganize''' <font color=red>секция</font> '''into ('''...''')'''; | ||
==== Перехеширование ==== | ==== Перехеширование ==== | ||
+ | В случе секционирования по хешу можно изменить количество бакетов, но нельзя повлиять на размещение записей по бакетам. | ||
+ | |||
'''alter table''' <font color=red>таблица</font> '''add partition''' <font color=red>число</font>''';''' | '''alter table''' <font color=red>таблица</font> '''add partition''' <font color=red>число</font>''';''' | ||
'''alter table''' <font color=red>таблица</font> '''coalesce partition''' <font color=red>число</font>''';''' | '''alter table''' <font color=red>таблица</font> '''coalesce partition''' <font color=red>число</font>''';''' | ||
Строка 59: | Строка 66: | ||
==== Индексы ==== | ==== Индексы ==== | ||
− | Индексы могут быть секционированы. | + | Индексы могут быть секционированы. |
+ | |||
+ | Типы индексов: | ||
+ | * Локальный — один на секцию | ||
+ | * Глобальный — один на таблицу | ||
+ | * Секционированный — разбит на секции по-своему | ||
+ | |||
+ | Локальный и глобальный индекс нужны для оптимизации запросов. | ||
+ | |||
+ | Секционированный индекс имеет смысл, если глобальный индекс слишком велик по размеру. Секционирование таблицы и индекса должено быть согласовано, чтобы не относить секцию таблицы к нескольким секциям индекса. Однако разрешается относить несколько секций таблицы к одной секции индекса. | ||
+ | |||
+ | == Литература == | ||
+ | * [https://www.postgresql.org/docs/current/ddl-partitioning.html PostgreSQL: Table Partitioning] | ||
+ | * [https://dev.mysql.com/doc/refman/8.0/en/partitioning.html MySQL: Partitioning] | ||
+ | |||
+ | [[Категория: Базы данных]] |
Текущая версия на 19:34, 4 сентября 2022
Определение: |
Секционирование — это разделение таблицы базы данных на отдельные фрагменты с раздельными настройками физического хранения. |
Фрагменты могут хранится на разных компьютерах или дисках одного компьютера. Секционирование используется в целях повышения производительности и доступности больших баз данных. Это достигается за счет параллельного чтения и записи на различных дисках, а также работы оптимизатора запросов.
Содержание
Типы секционирования
Вертикальное
Разбиение таблицы «по столбцам». Условие корректности: секции содержат надключ (следует из теоремы Фейгина).
Преимущества:
- Отделение «частых» данных от «редких»
- Защита информации (можно задать разные права доступа на разные секции)
- Автоматическая поддержка для CLOB и BLOB (они хранятся отдельно от записи)
Недостатки:
- Нет специальной поддержки
- Зависимость от представления
- Необходимость обновляемых представлений
Горизонтальное
Разбиение таблицы «по строкам». Условие корректности: каждая строка попадает ровно в одну секцию.
Преимущества:
- Отделение «близких» данных от «дальних» (например, зависящих от времени).
- Уменьшение размера секции
- Встроенная поддержка
- Прозрачность для пользователя
Недостатки:
- Возможное замедление работы
Пример: таблица Points(SId, CId, Mark, Date), секции разбиты по Date на основе года.
Методы секционирования
- Простые
- По диапазонам (задается границами)
- По значениям (списки конкретных значений)
- По хешу (записи разбиваются по хеш значению заданного набора столбцов)
- По выражению (секция задается любым методом простого секционирования)
- Составные (секции разбиваются на подсекции, например, сначала по диапазону, а затем по хешу)
При попытке записи значения, которое не попадает ни в одну секцию, происходит ошибка.
Управление секциями
Управление секционированием не входит в стандарт SQL, поэтому для различных баз данных приведенные запросы могут иметь отличный синтаксис.
Удаление секции
alter table таблица drop partition секция;
Разбиение секции
Разбиение одной секции на несколько. Получаемые секции должны быть согласованы, например, исходный диапазон полностью разбивается на несколько поддиапазонов.
alter table таблица reorganize секция into (...);
Перехеширование
В случе секционирования по хешу можно изменить количество бакетов, но нельзя повлиять на размещение записей по бакетам.
alter table таблица add partition число; alter table таблица coalesce partition число;
Оптимизация запросов
Оптимизатор запросов умеет использовать секционирование для повышения производительности. Ненужные секции могут быть отброшены, а запросы на оставшихся станут параллельными. Например, может быть оптимизирована операция select со сравнениями, =, in, between.
Индексы
Индексы могут быть секционированы.
Типы индексов:
- Локальный — один на секцию
- Глобальный — один на таблицу
- Секционированный — разбит на секции по-своему
Локальный и глобальный индекс нужны для оптимизации запросов.
Секционированный индекс имеет смысл, если глобальный индекс слишком велик по размеру. Секционирование таблицы и индекса должено быть согласовано, чтобы не относить секцию таблицы к нескольким секциям индекса. Однако разрешается относить несколько секций таблицы к одной секции индекса.