Shanraq.org Shanraq.org
Индекс, EXPLAIN и итоговый отчёт: завершение курса
IT

SQL: семейный бюджет без догадок Урок 4 из 4

Индекс, EXPLAIN и итоговый отчёт: завершение курса

Собираем семейный отчёт, измеряем план запроса, создаём полезный индекс и проверяем резервную копию восстановлением. Итог курса — не набор команд, а база, которой можно доверить повседневный вопрос.

Зачем это нужно

Правильный запрос может стать медленным на сотнях тысяч строк. Быстрый запрос может выдавать неверный итог. А база без проверенной копии остаётся одним повреждённым файлом.

Образ. Индекс — алфавитный указатель книги: он ускоряет поиск, но занимает место и требует обновления. Резервная копия — запасной ключ, который проверили на настоящей двери.

Сразу целиком

EXPLAIN QUERY PLAN
SELECT category_id, SUM(amount_tiyn)
FROM transactions
WHERE happened_on >= '2026-09-01' AND happened_on < '2026-10-01'
GROUP BY category_id;

CREATE INDEX transactions_month_category
    ON transactions(happened_on, category_id);

Итоговый отчёт запускается командой:

sqlite3 budget.db ".read course/sql-budget/report.sql"

Разбор

Индекс соответствует реальному пути запроса: сначала диапазон даты, затем категория. Он ускоряет чтение ценой диска и работы при вставке. Не создавайте индекс на каждый столбец и не судите по маленькой учебной таблице — сравнивайте план и время на данных реалистичного размера.

EXPLAIN QUERY PLAN — средство SQLite. Его вывод меняется между версиями и предназначен для диагностики, а не для разбора программой. Ищите полный просмотр SCAN там, где ожидался выборочный SEARCH, но учитывайте размер таблицы: полный просмотр маленькой таблицы может быть лучшим планом.

Повторяемый отчёт можно оформить как VIEW, если параметры не нужны. Представление хранит запрос, а не копию результата:

CREATE VIEW expense_by_category AS
SELECT category_id, SUM(amount_tiyn) AS amount_tiyn
FROM transactions
JOIN categories ON categories.id=category_id
WHERE categories.kind='expense'
GROUP BY category_id;

Для резервной копии SQLite используйте .backup budget-backup.db или официальный backup API, особенно если база открыта. Проверка копии — открыть её отдельно, выполнить PRAGMA integrity_check; и контрольный отчёт. Простое наличие файла ничего не доказывает.

Не храните семейные финансовые данные в публичном репозитории. Учебный seed.sql вымышлен; настоящий budget.db, экспорты и копии должны быть исключены из Git и защищены как персональные данные.

Карта урока

Запрос измеряется, индексируется и проверяется после восстановления

Скажите своими словами

  1. Какова цена индекса?
  2. Почему SCAN не всегда плох?
  3. Когда резервная копия считается проверенной?

Задание

Создайте budget-backup.db, откройте его новым процессом SQLite, выполните PRAGMA integrity_check; и месячный отчёт. Сравните три итоговые суммы с исходной базой.

Куда это встанет в проекте

Проект завершён: схема защищает факты, запросы объясняют расчёт, индекс имеет измеримую причину, копия восстанавливается.

Ответы

Показать ответы
sqlite3 budget.db ".backup budget-backup.db"
sqlite3 budget-backup.db "PRAGMA integrity_check;"
sqlite3 budget-backup.db ".read course/sql-budget/report.sql"

Ожидаются ok, доход 420 000,00 ₸, расход 127 800,00 ₸ и остаток 292 200,00 ₸.

Источники

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить задание

Сначала решите и запустите в VS Code — редактор покажет ошибку на месте. Готовое решение вставьте сюда. Проверяет модель: она укажет на ошибку, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.