Практика: Индексы в PostgreSQL
Онлайн редактор кода для PostgreSQL
Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1 — B-tree основы
Задание 1: Создание и обоснование B-tree индексов
⏱️ Примерное время: 10-20 минутСоздай B-tree индексы (простые, составные, уникальные) и обоснуй выбор порядка колонок.
Требования:
- минимум 2–3 индекса
- хотя бы один составной
- хотя бы один частичный (
WHERE) - напиши
CREATE INDEX+ 1–2 примера запросов, которые должны использовать индекс - короткое пояснение (1–2 предложения), почему именно такой порядок колонок
Пример:
CREATE INDEX idx_orders_date_status
ON orders (order_date, status)
WHERE status != 'canceled';
-- будет работать для:
SELECT * FROM orders
WHERE order_date >= '2025-01-01'
AND status = 'delivered'
ORDER BY order_date;
Задание 2 — Частичные индексы + выражения
Задание 2: Частичные индексы и индексы на выражения
⏱️ Примерное время: 20-30 минутСоздай индексы с WHERE-условием и//или на вычисляемые выражения.
Требования:
- хотя бы один частичный индекс (
WHERE) - хотя бы один индекс на выражение (
LOWER(),DATE(),(col1 * col2)) - покажи 1–2 запроса, которые используют созданный индекс
- объясни, почему без частичного индекса было бы хуже
Пример:
CREATE INDEX idx_users_email_lower ON users (LOWER(email))
WHERE is_verified = true;
-- ускоряет:
SELECT * FROM users WHERE LOWER(email) = 'test@gmail.com';
Задание 3 — GIN для JSONB, массивов, полнотекста
Задание 3: GIN-индексы (массивы, JSONB, tsvector)
⏱️ Примерное время: 25-40 минутСоздай GIN-индексы и напиши запросы, которые их используют.
Требования:
USING GIN- минимум 2 разных запроса (
@>,&&,?,@@, etc.) - покажи
EXPLAIN(можно текстом) или объясни, почему GIN здесь лучше B-tree - (бонус) добавь
fastupdate = offилиgin_pending_list_limitи поясни
Пример:
CREATE INDEX idx_products_tags_gin ON products USING gin(tags);
SELECT * FROM products
WHERE tags && ARRAY['sale', 'new-year'];
Задание 4 — BRIN для больших временных рядов
Задание 4: BRIN индексы + сравнение размеров
⏱️ Примерное время: 20-35 минутРабота с BRIN на большой таблице логов / заказов / событий.
Требования:
- создай BRIN индекс
- создай для сравнения обычный B-tree на ту же колонку
- выведи размеры (
pg_size_pretty(pg_relation_size(...))) - напиши 2–3 запроса по диапазону дат, которые выигрывают от BRIN
- (бонус) измени
pages_per_rangeи поясни эффект
Пример:
CREATE INDEX idx_logs_brin_time ON app_logs USING brin(logged_at);
SELECT pg_size_pretty(pg_relation_size('idx_logs_brin_time'));
Задание 5 — Итоговое: Оптимизация поисковой системы магазина
Задание 5: Комплексная оптимизация (итоговое)
⏱️ Примерное время: 50-90 минутПредложи набор индексов для интернет-магазина / блога / логов.
Требования:
- минимум 6–8 индексов разных типов
- обязательно должны быть: B-tree составной, частичный, GIN, BRIN
- хотя бы один индекс на выражение
- для каждого индекса — 1 типичный запрос + пояснение
- таблица сравнения (какой тип индекса для какой задачи)
- (желательно) 1–2 примера
EXPLAIN ANALYZE(можно описать словами)
Это задание можно использовать как мини-проект / портфолио.
Хороший набор индексов — это баланс между скоростью чтения, размером на диске и скоростью записи.
Самые частые ошибки: избыточные индексы, неправильный порядок в составных индексах, GIN там где хватило бы B-tree.