Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 467новых вакансий за сутки·93 721вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 267
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

DevOps и инфраструктура

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

Аналитика и данные

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

Другие направления

  • Проджект-менеджер616
  • UI/UX дизайн146
  • Ручное тестирование14

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме PostgreSQLВсе вопросы
PostgreSQLSeniorПроектирование систем

Каковы стратегии партиционирования таблиц в PostgreSQL (range, list, hash)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

PostgreSQL поддерживает три стратегии: RANGE (диапазоны, типично по времени), LIST (дискретные категории) и HASH (равномерное распределение по N секциям). Partition pruning работает только когда WHERE содержит ключ партиционирования.

RANGE — партиционирование по диапазону

Используется для временны́х данных (логи, события, заказы по дате). Планировщик автоматически исключает секции вне запрошенного диапазона.

CREATE TABLE events (
  id          BIGSERIAL,
  created_at  TIMESTAMPTZ NOT NULL,
  user_id     BIGINT,
  payload     JSONB
) PARTITION BY RANGE (created_at);

-- Создание секций вручную
CREATE TABLE events_2024_01
  PARTITION OF events
  FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');

CREATE TABLE events_2024_02
  PARTITION OF events
  FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');

-- Секция для «всего остального» (DEFAULT)
CREATE TABLE events_default
  PARTITION OF events DEFAULT;

-- Partition pruning в действии
EXPLAIN SELECT * FROM events WHERE created_at >= '2024-01-15';
-- Partitions: Seq Scan on events_2024_01, events_2024_02... (остальные исключены)

Зачем нужно партиционирование

Партиционирование делит одну логическую таблицу на физически отдельные «секции» (partitions). PostgreSQL поддерживает декларативное партиционирование с версии 10. Основные выгоды: partition pruning (планировщик сканирует только релевантные секции), параллельный scan, быстрое удаление старых данных через DROP PARTITION вместо DELETE.

LIST — партиционирование по списку значений

Используется для дискретных категорий: регион, статус, тип объекта. Не подходит для полей с высокой кардинальностью.

CREATE TABLE orders (
  id      BIGSERIAL,
  region  TEXT NOT NULL,
  amount  NUMERIC
) PARTITION BY LIST (region);

CREATE TABLE orders_eu
  PARTITION OF orders
  FOR VALUES IN ('DE', 'FR', 'NL', 'PL');

CREATE TABLE orders_us
  PARTITION OF orders
  FOR VALUES IN ('US', 'CA');

CREATE TABLE orders_apac
  PARTITION OF orders
  FOR VALUES IN ('JP', 'SG', 'AU');

CREATE TABLE orders_other
  PARTITION OF orders DEFAULT;

HASH — партиционирование по хешу

Равномерно распределяет строки по N секциям. Используется когда нет естественного диапазона или списка, но хочется уменьшить размер каждой секции (например, для параллельного vacuum или разноса по разным tablespace).

CREATE TABLE user_activity (
  id      BIGSERIAL,
  user_id BIGINT NOT NULL,
  data    JSONB
) PARTITION BY HASH (user_id);

-- 4 равных секции
CREATE TABLE user_activity_p0
  PARTITION OF user_activity
  FOR VALUES WITH (MODULUS 4, REMAINDER 0);

CREATE TABLE user_activity_p1
  PARTITION OF user_activity
  FOR VALUES WITH (MODULUS 4, REMAINDER 1);

CREATE TABLE user_activity_p2
  PARTITION OF user_activity
  FOR VALUES WITH (MODULUS 4, REMAINDER 2);

CREATE TABLE user_activity_p3
  PARTITION OF user_activity
  FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Индексы на партиционированных таблицах

-- Глобальный индекс создаётся автоматически на всех секциях
CREATE INDEX idx_events_user_id ON events (user_id);

-- PRIMARY KEY и UNIQUE должны включать ключ партиционирования
ALTER TABLE events ADD PRIMARY KEY (id, created_at);

Автоматическое создание секций

Для RANGE по времени используют pg_partman — расширение для автоматического создания и удаления секций по расписанию.

-- После установки pg_partman
SELECT partman.create_parent(
  p_parent_table := 'public.events',
  p_control := 'created_at',
  p_type := 'native',
  p_interval := '1 month',
  p_premake := 3  -- создать 3 секции вперёд
);

Подводные камни

  • Partition key в WHERE обязателен для pruning. Если запрос не фильтрует по ключу партиционирования, PostgreSQL сканирует все секции. EXPLAIN покажет «Append» со всеми дочерними узлами.
  • PRIMARY KEY / UNIQUE должны включать ключ партиционирования. Это ограничение архитектуры декларативного партиционирования в PostgreSQL — глобальных уникальных индексов нет.
  • Внешние ключи на партиционированную таблицу не поддерживаются (FK из другой таблицы, ссылающийся на партиционированную). Решение — триггеры или денормализация.
  • Слишком много секций замедляет planning time. При 1000+ секций планировщик тратит значительное время на pruning. Оптимум — десятки, максимум сотня секций.
  • DROP TABLE partition vs DETACH + DROP. DETACH PARTITION позволяет «открепить» секцию и работать с ней как с обычной таблицей. С PG 14 есть DETACH CONCURRENTLY без долгой блокировки.
  • Bloat в DEFAULT-секции. Если данные часто попадают в DEFAULT, а потом новые секции создаются вручную, DEFAULT разрастается. Используйте pg_partman для автоматизации.
  • Миграция существующей таблицы. Нельзя конвертировать обычную таблицу в партиционированную на месте. Нужно создать новую, перелить данные, переименовать.

Типичные ошибки

  • Отвечать про range/list/hash partitioning как про абстрактный SQL без учета MVCC, WAL, planner или конкретной версии PostgreSQL.
  • Переносить поведение MySQL или ClickHouse на PostgreSQL без проверки документации.
  • Не связывать механизм с последствиями для индексов, транзакций, блокировок или эксплуатации.
  • Показывать синтаксис, который не поддерживается PostgreSQL.

Что проверяет интервьюер

  • Кандидат объясняет range/list/hash partitioning через реальный механизм PostgreSQL, а не общими словами.
  • Приводит корректный SQL или диагностический запрос для этой СУБД.
  • Называет ограничения, версионные отличия или эксплуатационные последствия.
  • Связывает ответ с проектированием приложения, производительностью, надежностью или безопасностью.

Как вы знаете этот вопрос?

Проверить себя по теме PostgreSQL →

Источники

  • https://www.postgresql.org/docs/current/ddl-partitioning.html
←Предыдущий вопросЧто такое window functions (OVER (PARTITION BY ... ORDER BY ...))? Чем ROW_NUMBER, RANK, DENSE_RANK отличаются?Следующий вопрос→Что такое autovacuum и как настраивать его поведение?

Связанные темы

PostgreSQLdata-modelingoperations-planning

Вакансии с этим навыком

PostgreSQL вакансии
  • Fullstack-разработчик (Middle+ / Senior)
  • Fullstack-разработчик
  • Propulsion Software Engineer (Falcon Engineering)
  • Software Engineer, Manufacturing
  • Software Engineer, Full Stack (Data & Video Analysis)

Частые вопросы на собеседовании

  • Что делает VACUUM, VACUUM FULL, ANALYZE? Чем они отличаются и какой когда применять?
  • Какие уровни изоляции есть и чем отличаются (READ COMMITTED, REPEATABLE READ, SERIALIZABLE)? Какой по умолчанию в Postgres?
  • Что такое PITR и чем pg_dump отличается от base backup + WAL archive?
  • Каковы типы индексов в PostgreSQL (B-tree, Hash, GIN, GiST, BRIN)?