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

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

Ответ

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

Цели партиционирования:

  • Улучшение производительности запросов: Запросы, которые могут быть ограничены одной или несколькими партициями, выполняются быстрее, так как сканируется меньше данных (Partition Pruning).
  • Упрощение управления: Операции обслуживания (очистка старых данных, перестроение индексов) можно выполнять на уровне партиций, а не всей таблицы.
  • Повышение доступности: В некоторых СУБД сбои или операции обслуживания могут затрагивать только отдельные партиции.

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

  1. Партиционирование по диапазону (Range): Данные распределяются на основе диапазона значений ключевого столбца (например, по дате: PARTITION BY RANGE (created_at)).

    -- Пример для PostgreSQL
    CREATE TABLE orders (
        id SERIAL,
        order_date DATE NOT NULL,
        amount DECIMAL
    ) PARTITION BY RANGE (order_date);
    
    CREATE TABLE orders_2023_q1 PARTITION OF orders
        FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');
  2. Партиционирование по списку (List): Партиция содержит строки, ключ которых соответствует заданному списку значений (например, по региону).

  3. Партиционирование по хешу (Hash): Данные распределяются по партициям на основе хеш-функции от ключа, что обеспечивает равномерное распределение.

Важные замечания:

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