Что такое партиционирование таблиц в базах данных?

«Что такое партиционирование таблиц в базах данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные цели:

  • Повышение производительности запросов: Запрос, использующий ключ партиционирования, может сканировать только релевантные партиции вместо всей таблицы (partition pruning).
  • Упрощение управления данными: Операции обслуживания (очистка старых данных, загрузка новых) выполняются на уровне партиций (например, DROP PARTITION).
  • Повышение доступности: Отказ одной партиции не обязательно влияет на доступность других.

Основные типы партиционирования:

Тип Описание Пример использования
По диапазону (RANGE) Данные распределяются на основе диапазонов значений ключевого столбца. PARTITION BY RANGE (sale_date) для данных по месяцам или годам.
По списку (LIST) Каждая партиция содержит данные для явно заданного списка значений. PARTITION BY LIST (region_code) для данных по странам или регионам.
По хэшу (HASH) Данные распределяются по партициям с помощью хэш-функции от ключа. Обеспечивает равномерное распределение. PARTITION BY HASH (user_id) для балансировки нагрузки.
Композитное Комбинация методов, например, RANGE с последующим HASH.

Пример на SQL (PostgreSQL):

-- Создание партиционированной таблицы по диапазону дат
CREATE TABLE sales (
    id SERIAL,
    sale_date DATE NOT NULL,
    amount DECIMAL(10,2)
) PARTITION BY RANGE (sale_date);

-- Создание отдельных партиций
CREATE TABLE sales_2023_q1 PARTITION OF sales
    FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');

CREATE TABLE sales_2023_q2 PARTITION OF sales
    FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');

-- Запрос автоматически затронет только нужную партицию
SELECT SUM(amount) FROM sales WHERE sale_date BETWEEN '2023-01-15' AND '2023-02-20';