Секционирование — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(управление секциями дополнено)
м (rollbackEdits.php mass rollback)
 
(не показано 6 промежуточных версий 5 участников)
Строка 2: Строка 2:
 
|definition =
 
|definition =
 
'''Секционирование''' — это разделение таблицы базы данных на отдельные фрагменты с раздельными настройками физического хранения.}}
 
'''Секционирование''' — это разделение таблицы базы данных на отдельные фрагменты с раздельными настройками физического хранения.}}
 
+
Фрагменты могут хранится на разных компьютерах или дисках одного компьютера. Секционирование используется в целях повышения производительности и доступности больших баз данных. Это достигается за счет параллельного чтения и записи на различных дисках, а также работы оптимизатора запросов.
Фрагменты могут хранится на разных компьютерах или дисках одного компьютера. Используется в целях повышения производительности и доступности больших баз данных. Это достигается за счет параллельного чтения и записи на различных дисках.
 
  
 
== Типы секционирования ==
 
== Типы секционирования ==
  
 
=== Вертикальное ===
 
=== Вертикальное ===
TBF
+
Разбиение таблицы «по столбцам». Условие корректности: секции содержат надключ (следует из теоремы Фейгина).
 +
 
 +
Преимущества:
 +
* Отделение «частых» данных от «редких»
 +
* Защита информации (можно задать разные права доступа на разные секции)
 +
* Автоматическая поддержка для CLOB и BLOB (они хранятся отдельно от записи)
 +
 
 +
Недостатки:
 +
* Нет специальной поддержки
 +
* Зависимость от представления
 +
* Необходимость обновляемых представлений
  
 
=== Горизонтальное ===
 
=== Горизонтальное ===
TBF
+
Разбиение таблицы «по строкам». Условие корректности: каждая строка попадает ровно в одну секцию.
 +
 
 +
Преимущества:
 +
* Отделение «близких» данных от «дальних» (например, зависящих от времени).
 +
* Уменьшение размера секции
 +
* Встроенная поддержка
 +
* Прозрачность для пользователя
 +
 
 +
Недостатки:
 +
* Возможное замедление работы
 +
 
 +
Пример: таблица Points(SId, CId, Mark, Date), секции разбиты по Date на основе года.
  
 
== Методы секционирования ==
 
== Методы секционирования ==
  
 
* Простые
 
* Простые
** По диапазонам
+
** По диапазонам (задается границами)
** По значениям
+
** По значениям (списки конкретных значений)
** По хешу
+
** По хешу (записи разбиваются по хеш значению заданного набора столбцов)
* По выражению
+
* По выражению (секция задается любым методом простого секционирования)
* Составные
+
* Составные (секции разбиваются на подсекции, например, сначала по диапазону, а затем по хешу)
** По диапазону и хешу
+
 
** ...
+
При попытке записи значения, которое не попадает ни в одну секцию, происходит ошибка.
  
 
== Управление секциями ==
 
== Управление секциями ==
 +
Управление секционированием не входит в стандарт SQL, поэтому для различных баз данных приведенные запросы могут иметь отличный синтаксис.
  
 
==== Удаление секции ====
 
==== Удаление секции ====
Строка 30: Строка 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>''';'''
  
==== Отбрасывание секций ====
+
==== Оптимизация запросов ====
Оптимизатор запросов умеет использовать секционирование для повышения производительности. Например, может быть оптимизирована операция '''select''' со сравнениями, '''=''', '''in''', '''between'''.
+
Оптимизатор запросов умеет использовать секционирование для повышения производительности. Ненужные секции могут быть отброшены, а запросы на оставшихся станут параллельными. Например, может быть оптимизирована операция '''select''' со сравнениями, '''=''', '''in''', '''between'''.
  
 
==== Индексы ====
 
==== Индексы ====
  
 
Индексы могут быть секционированы.
 
Индексы могут быть секционированы.
 +
 +
Типы индексов:
 +
* Локальный — один на секцию
 +
* Глобальный — один на таблицу
 +
* Секционированный — разбит на секции по-своему
 +
 +
Локальный и глобальный индекс нужны для оптимизации запросов.
 +
 +
Секционированный индекс имеет смысл, если глобальный индекс слишком велик по размеру. Секционирование таблицы и индекса должено быть согласовано, чтобы не относить секцию таблицы к нескольким секциям индекса. Однако разрешается относить несколько секций таблицы к одной секции индекса.
 +
 +
== Литература ==
 +
* [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.

Индексы

Индексы могут быть секционированы.

Типы индексов:

  • Локальный — один на секцию
  • Глобальный — один на таблицу
  • Секционированный — разбит на секции по-своему

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

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

Литература