
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 и защищены как персональные данные.
Карта урока
Скажите своими словами
- Какова цена индекса?
- Почему
SCANне всегда плох? - Когда резервная копия считается проверенной?
Задание
Создайте 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 ₸.
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.