Таблица в СУБД — это неупорядоченная «куча» (Heap) дисковых страниц по 8 КБ.
Сбалансированное дерево хранит упорядоченные ключи и физические указатели (TID).
Запрос: WHERE id = 459102 или WHERE contract = 'DOG-2024-98'.
CREATE UNIQUE INDEX idx_client_contract
ON bank_clients (contract_number);
SELECT full_name, status, monthly_income
FROM bank_clients
WHERE contract_number = 'DOG-2024-98412';
-- План: Index Scan using idx_client_contract
-- Execution Time: 0.038 ms
Операторы: BETWEEN, >=, <=, >, <.
ORDER BY выполняется автоматически без процессорной сортировки!SELECT record_id, patient_name, visit_date
FROM medical_records
WHERE visit_date BETWEEN '2024-01-01'
AND '2024-06-30'
ORDER BY visit_date ASC;
-- План: Index Scan using idx_med_date
-- Rows: 450, Filter: none, Sort: not needed
СУБД транслирует предикат в диапазон: col >= 'Иван' AND col < 'Ивао'.
varchar_pattern_ops для локалей UTF-8.Первый символ неизвестен! Маршрутизация по B-Tree невозможна.
pg_trgm (GIN/GiST) или FTS.Индекс (region, status, income) упорядочивает строки по первому полю, затем по второму внутри равных первых, и по третьему внутри равных первых и вторых.
WHERE region = 'ХМАО'WHERE region = 'ХМАО' AND status = 'ACTIVE'WHERE region = 'ХМАО' AND status = 'ACTIVE' AND income > 100kWHERE status = 'ACTIVE' (пропущен префикс!)WHERE income > 100000 (пропущен префикс!)WHERE status = 'ACTIVE' AND income > 100000CREATE INDEX idx ON orders (created_at, client_id);
Запрос: WHERE created_at > '2024-01-01' AND client_id = 42
client_id проверяется в цикле фильтром на лету.CREATE INDEX idx ON orders (client_id, created_at);
Запрос: WHERE client_id = 42 AND created_at > '2024-01-01'
В таблице есть отдельные индексы: idx_region и idx_status.
Запрос: WHERE region = 'ХМАО' AND status = 'ACTIVE'
Bitmap Heap Scan on bank_clients
Recheck Cond: (region = 'ХМАО' AND status = 'ACTIVE')
-> BitmapAnd
-> Bitmap Index Scan on idx_region
-> Bitmap Index Scan on idx_status
to_tsvector — нормализует слова и удаляет шум:
to_tsvector('russian', 'Проектирование баз данных')
=> 'баз':2 'дан':3 'проектирован':1
to_tsquery — логическое выражение поиска:
to_tsquery('russian', 'база & проект:*')
Оператор проверки: tsvector @@ tsquery
'база' & 'нормализация' СУБД пересекает два коротких списка идентификаторов.CREATE INDEX idx_books_fts
ON books USING gin (
to_tsvector('russian',
title || ' ' || coalesce(annotation, ''))
);
-- Поиск книги:
SELECT title, author_name
FROM books
WHERE to_tsvector('russian', title || ' ' || annotation)
@@ to_tsquery('russian', 'нормализац:* & реляцион:*');
Инженер баз данных не гадает о скорости, а оформляет поисковый протокол с фиксацией параметров оптимизатора:
WHERE.Index Scan, Bitmap Index Scan, Seq Scan.EXPLAIN ANALYZE.LIKE 'prefix%' указывать varchar_pattern_ops.tsvector и индексах GIN.EXPLAIN (ANALYZE, BUFFERS).LIKE '%слово%' на миллионных таблицах без GIN-триграмм.Номер договора (Unique B-Tree), маска ФИО ('Иван%'), составной фильтр: Регион + Статус + Доход.
Поиск по ISBN, поиск по автору, полнотекстовый поиск по аннотации с GIN-индексом и стеммингом.
Полис ОМС, диапазон дат визитов (Index Range Scan), комбинированный поиск: Отделение + Диагноз (МКБ).
Тикет по ID, префикс темы, очередь инженера: Исполнитель + Статус + Приоритет + Сортировка даты.
Данная работа подводит итог Темы 3 «Этапы проектирования баз данных».
Оценки за практическое занятие №8 идут в итоговую аттестационную ведомость семестра!
Robert'); DROP TABLE Students;--.