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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 073
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 805
  • Продакт-менеджер1 266

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 763
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 261
  • CI/CD3 240
  • Мониторинг и Observability1 783
  • SRE566
  • Кибербезопасность453

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

  • Data Scientist1 140
  • Бизнес-аналитик930
  • Аналитик данных853
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 685
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 887
  • Релокация в США43 685
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Что произойдёт, если индексов много? Какова цена индексов при INSERT/UPDATE?

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

Каждый индекс требует обновления при INSERT и при UPDATE индексируемого столбца, блокирует HOT-обновления, увеличивает WAL и замедляет репликацию. Избыточные индексы выявляют через pg_stat_user_indexes (idx_scan = 0).

HOT update и его условия

При UPDATE PostgreSQL пытается использовать Heap Only Tuple (HOT) обновление — новая версия строки пишется в тот же heap page, а индексы не обновляются. HOT возможен только если: изменённые столбцы не входят ни в один индекс, и в heap page есть свободное место.

Если обновляется индексируемый столбец — HOT невозможен. PostgreSQL создаёт новую версию строки и обновляет все затронутые индексы. Старые index tuples помечаются как мёртвые и убираются при следующем VACUUM.

-- Проверить, сколько индексов у таблицы и как они используются
SELECT
    indexrelname,
    idx_scan,
    idx_tup_read,
    idx_tup_fetch,
    pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
FROM pg_stat_user_indexes
WHERE relname = 'orders'
ORDER BY idx_scan ASC;

-- Найти неиспользуемые индексы (кандидаты на удаление)
SELECT schemaname, relname, indexrelname, idx_scan
FROM pg_stat_user_indexes
WHERE idx_scan = 0
  AND schemaname = 'public'
ORDER BY pg_relation_size(indexrelid) DESC;

Что происходит при INSERT с несколькими индексами

При каждом INSERT PostgreSQL обязан обновить все индексы таблицы. Для таблицы с 8 индексами это 8 отдельных B-tree операций записи плюс соответствующие WAL записи для каждой. Стоимость растёт примерно линейно с числом индексов.

Write amplification и WAL

Каждая запись в индекс генерирует WAL. На таблице с 10 индексами один INSERT может генерировать в 5–10 раз больше WAL, чем на таблице без индексов. Это увеличивает:

  • Время выполнения INSERT/UPDATE на primary
  • Лаг логической и физической репликации
  • Нагрузку на диск (особенно на burst write)
  • Время bulk load (COPY, pg_restore)
-- При bulk load: удалить индексы до загрузки, восстановить после
-- Это ускоряет загрузку в 3-10 раз для больших таблиц
DROP INDEX CONCURRENTLY idx_orders_status;
COPY orders FROM '/tmp/orders_dump.csv' CSV;
CREATE INDEX CONCURRENTLY idx_orders_status ON orders (status);
ANALYZE orders;

Bloat от UPDATE

После UPDATE индексируемого столбца старый index tuple остаётся в B-tree до VACUUM. Если autovacuum не успевает — индекс раздувается. Bloated индекс занимает больше места и медленнее сканируется. Проверить можно через расширение pgstattuple:

-- Требует расширения pgstattuple
SELECT * FROM pgstatindex('idx_orders_status');
-- Смотреть: dead_tuple_percent > 10% — сигнал к REINDEX CONCURRENTLY

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

  • Удалять индекс только по нулевому idx_scan опасно: он может поддерживать PRIMARY KEY, UNIQUE constraint или использоваться редко при аварийных запросах.
  • Добавление индекса на high-write таблицу без нагрузочного теста может ухудшить p95/p99 latency INSERT в 2–3 раза.
  • HOT update блокируется даже одним индексом по обновляемому столбцу — частые UPDATE полей вроде updated_at или status накапливают dead tuples быстрее при наличии индексов.
  • Лаг репликации растёт пропорционально объёму WAL — на write-heavy нагрузке каждый лишний индекс увеличивает лаг на репликах.
  • Partial index (WHERE status = 'active') может быть в 10–100 раз меньше полного и почти не влиять на write overhead для строк, не попадающих в предикат.
  • Статистика pg_stat_user_indexes сбрасывается при pg_stat_reset() и после рестарта — низкий idx_scan сразу после деплоя не показателен.
  • REINDEX CONCURRENTLY на большой таблице создаёт временный индекс рядом — нужно убедиться, что на диске достаточно места (2× размер индекса).
  • Индексы на foreign key колонках нужны не для SELECT, а для ускорения DELETE/UPDATE на родительской таблице — удаление такого «неиспользуемого» индекса вызовет full scan дочерней таблицы при каждом DELETE из родительской.

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

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

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

  • Считать индекс бесплатным.
  • Удалять индексы без проверки constraints.
  • Не связывать индексы с WAL и replica lag.

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

  • Просит объяснить HOT update.
  • Проверяет метрики pg_stat_user_indexes.
  • Уточняет write amplification.

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

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

Источники

  • https://www.postgresql.org/docs/current/indexes-types.html
  • https://www.postgresql.org/docs/current/routine-vacuuming.html

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

PostgreSQLindex-designperformance-analysis

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

PostgreSQL вакансии
  • QA Manual Engineer
  • Backend Developer (Scala/ZIO)
  • Java Backend Developer
  • Fullstack QA Python
  • Linux System Administrator