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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

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

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

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

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

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

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

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

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

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Что такое expression index (например, CREATE INDEX ON users (lower(email)))? Когда он спасает?

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

Expression index хранит результат выражения (например, lower(email)) и позволяет ускорить запросы, использующие это же выражение в WHERE. Функция должна быть IMMUTABLE; запрос должен использовать точно то же выражение.

Главное ограничение: стабильность функции

Функция в индексе должна быть IMMUTABLE — возвращать одинаковый результат для одинаковых аргументов всегда, без зависимости от БД-состояния или текущего времени. STABLE и VOLATILE функции запрещены в выражении индекса.

-- lower() — IMMUTABLE, можно
CREATE UNIQUE INDEX idx_users_lower_email ON users (lower(email));

-- now() — STABLE, НЕЛЬЗЯ
-- ERROR: functions in index expression must be marked IMMUTABLE
-- CREATE INDEX ... ON orders (date_trunc('day', now()));

Что такое expression index

Expression index хранит не значение колонки, а результат произвольного выражения — функции, оператора или комбинации. PostgreSQL вычисляет выражение при вставке/обновлении строки и сохраняет результат в индексе. При запросе планировщик использует индекс, если выражение в WHERE или ORDER BY точно совпадает с выражением индекса.

Кейс 1: case-insensitive email

-- Индекс на выражение
CREATE UNIQUE INDEX idx_users_lower_email ON users (lower(email));

-- Запрос ДОЛЖЕН использовать то же выражение
SELECT id, name FROM users WHERE lower(email) = lower($1);
-- ИЛИ (если клиент нормализует email перед отправкой)
SELECT id, name FROM users WHERE lower(email) = 'john@example.com';

-- Этот запрос НЕ использует expression index:
SELECT id, name FROM users WHERE email = 'john@example.com';
-- (потому что индекс по lower(email), а не по email)

Кейс 2: извлечение ключа из JSONB

-- Индекс на JSONB-поле (если поле используется в WHERE постоянно)
CREATE INDEX idx_orders_meta_source
ON orders ((metadata->>'source'));

-- Запрос с тем же выражением
SELECT * FROM orders WHERE (metadata->>'source') = 'mobile_app';

Кейс 3: нормализация телефона

-- Удаляем нецифровые символы
CREATE OR REPLACE FUNCTION normalize_phone(p text) RETURNS text
    LANGUAGE sql IMMUTABLE STRICT AS
$$
    SELECT regexp_replace(p, '[^0-9]', '', 'g');
$$;

CREATE INDEX idx_contacts_phone ON contacts (normalize_phone(phone));

SELECT * FROM contacts WHERE normalize_phone(phone) = normalize_phone($1);

Кейс 4: computed bucket для шардинга

CREATE INDEX idx_events_bucket ON events ((user_id % 16));
SELECT * FROM events WHERE (user_id % 16) = 5;

Проверка использования

EXPLAIN (ANALYZE, BUFFERS)
SELECT id FROM users WHERE lower(email) = 'test@example.com';
-- Ожидаем: Index Scan using idx_users_lower_email on users

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

  • Запрос должен использовать точно то же выражение — lower(email) и lower(trim(email)) дают разные индексы.
  • При каждом UPDATE затронутой колонки PostgreSQL пересчитывает выражение и обновляет индекс — дороже, чем простой колоночный индекс.
  • ORM (SQLAlchemy, Prisma) обычно не знают об expression index — запрос может быть сгенерирован без выражения и не использовать индекс.
  • pg_dump включает выражение индекса дословно — при изменении функции индекс нужно пересоздать вручную.
  • Статистика для expression index хранится отдельно; ANALYZE обновляет её, но иногда планировщик неверно оценивает selectivity — проверяйте pg_stats по имени индекса.
  • UNIQUE expression index работает корректно только если функция детерминирована: два разных email, дающих одинаковый lower(), будут конфликтовать — что и нужно для case-insensitive uniqueness.
  • Не путайте с generated columns (PostgreSQL 12+): генерированная колонка хранит значение в таблице и индексируется обычным образом; expression index хранит только в индексе.
  • Функция с параметрами collation (lower(email COLLATE "C")) создаёт другой индекс, чем без collation — следите за совпадением.

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

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

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

  • Создать индекс по email и ждать ускорения lower(email).
  • Забыть UNIQUE для нормализованного email.
  • Использовать нестабильное выражение.

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

  • Просит написать индекс для case-insensitive email.
  • Проверяет совпадение выражения в WHERE.
  • Уточняет write overhead.

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

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

Источники

  • https://www.postgresql.org/docs/current/indexes-expressional.html

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

PostgreSQLindex-designquery-optimization

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

PostgreSQL вакансии
  • Системный аналитик
  • Разработчик Python (ИИ-помощник)
  • Lead Cloud Engineer (Azure) — Interview Experts Needed (#5499)
  • Senior DataOps Engineer (#5858)
  • Senior Python Engineer (with TypeScript and Agentic development experience) (#5874)