Добавил:
МТУСИ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

отчет 5

.docx
Скачиваний:
0
Добавлен:
10.10.2025
Размер:
949.52 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

Ордена Трудового Красного Знамени

Федеральное государственное бюджетное образовательное учреждение высшего образования

МОСКОВСКИЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ СВЯЗИ И ИНФОРМАТИКИ

ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Кафедра «Программная инженерия»

Лабораторная работа №5

по дисциплине «Рефакторинг баз данных и приложений» на тему

«Рефакторинг приложений с целью оптимизации запросов и индексов базы данных»

Выполнил: Студент гр. БПИ 2304

Афанасьев А.С.

2025

Цель работы

1. Изучить основные принципы оптимизации SQL-запросов.

2. Научиться выявлять узкие места в работе базы данных.

3. Освоить создание, модификацию и удаление индексов для ускорения запросов.

4. Применить знания на практике для оптимизации базы данных и приложения.

Задание

1. Ознакомьтесь с теоретическими аспектами как работают индексы в реляционных базах данных, влияние индексов на производительность SELECT, INSERT, UPDATE и DELETE запросов, распространенные проблемы в SQL-запросах (например, отсутствие индексов, избыточные JOIN-операции, SELECT * и т.д.), изучите инструменты мониторинга производительности базы данных (например, EXPLAIN, EXPLAIN ANALYZE для PostgreSQL/MySQL). 2. Используйте предоставленную базу данных или проект, содержащий примеры низкоэффективных запросов. Проведите анализ производительности текущих SQL запросов: используйте команды анализа, такие как `EXPLAIN`, чтобы понять, как запрос обрабатывается базой данных, найдите узкие места (например, полные сканирования таблиц вместо использования индексов). 3. Оптимизируйте SQL-запросы: замените неэффективные запросы (например, `SELECT *`) на более узкие выборки столбцов, уменьшите количество JOIN-операций, если это возможно, перепишите запросы для использования индексов. Сравните производительность запросов до и после оптимизации, используя инструменты анализа (например, время выполнения или EXPLAIN). 4. Добавьте индексы к таблицам для ускорения наиболее часто используемых запросов. Проверьте влияние индексов на производительность: сравните время выполнения запросов до и после добавления индексов, используйте EXPLAIN, чтобы убедиться, что индексы действительно используются. Изучите влияние индексов на операции вставки и обновления данных (INSERT, UPDATE). Удалите неиспользуемые или дублирующийся индексы, если они замедляют операции. 6. Подготовьте отчет, включающий список проблемных запросов и их анализ (до оптимизации), измененные запросы с описанием внесенных улучшений, добавленные, измененные или удаленные индексы (с пояснением причин), сравнительные результаты производительности до и после оптимизации.

Ход выполнения

Я подготовил пример лабораторной работы с проектом около 200 строк кода на Python в Visual Studio Code. Код представляет собой набор Python-скриптов, предназначенных для создания, заполнения, оптимизации и тестирования производительности базы данных SQLite.

Мы проведем рефакторинг и последовательно загрузим код на GitHub.

Рисунок 1. Исходный код

Рисунок 2. Исходный код

Р исунок 3. Исходный код

Процесс рефакторинга.

Рисунок 4. Новая структура проекта

Рисунок 5. data_generator.py

Рисунок 6. data_generator.py

Рисунок 7. queries.py

Рисунок 8. main.py

Рисунок 9. main.py

Рисунок 10. index_manager.py

Рисунок 11. db_utils.py

Рисунок 12. db_utils.py

Рисунок 13. Вывод программы

Описание изменений

Декомпозиция монолитного кода на модули (Функциональное разделение).

Проблема (до рефакторинга): Весь код находился в одном файле (main.py). Это делало его громоздким, трудным для навигации, понимания отдельных частей и повторного использования кода. Функции для работы с базой данных, генерации данных, выполнения запросов и управления индексами были перемешаны.

Решение (рефакторинг): Код был разбит на логически связанные модули, каждый из которых помещен в отдельный файл:

db_utils.py: Выделены функции, отвечающие за установление соединения с базой данных (connect_to_db), создание таблиц (create_tables) и закрытие соединения. Это централизовало управление базой данных.

data_generator.py: Перемещена логика заполнения таблиц данными (populate_tables). Это отделило процесс инициализации данных от основной логики приложения.

queries.py: Вынесены все SQL-запросы (get_students_from_city_no_index, get_courses_in_department_inefficient и т.д.). Это сделало управление и анализ SQL-запросов более удобным.

index_manager.py: Добавлена логика для управления индексами (создание, удаление, анализ планов выполнения), что выделило функциональность, связанную с оптимизацией производительности.

main.py: Стал более высокоуровневым, координируя работу этих модулей: подключение к БД, создание таблиц, заполнение данными, запуск тестов производительности и управление индексами.

Это напрямую соответствует принципам модульности и структурирования кода. Разделение ответственности делает код более поддерживаемым и читаемым.

Улучшение читаемости и организации кода.

Проблема (до рефакторинга): Большой объем кода в одном файле затруднял его быстрое понимание и навигацию.

Решение (рефакторинг): Разбиение на файлы с понятными именами и размещение связанных функций вместе значительно улучшили читаемость и организацию кода.

Повышение возможности повторного использования кода.

Проблема (до рефакторинга): Функции были определены в одном файле, и их повторное использование в других контекстах могло быть затруднено.

Решение (рефакторинг): Выделение логически завершенных блоков кода в отдельные модули (например, функции для работы с БД в db_utils.py) повысило возможность их повторного использования как в рамках текущего проекта, так и потенциально в других.

Разделение ответственности за данные и запросы.

Проблема (до рефакторинга): Логика заполнения данных и выполнения запросов была сосредоточена в основном файле.

Решение (рефакторинг): Перемещение логики генерации данных в data_generator.py и SQL-запросов в queries.py сделало код более организованным и специализированным.

Это улучшает поддерживаемость и понятность кода, особенно при дальнейшем развитии проекта и добавлении новых функций.

Подготовка к оптимизации и тестированию.

Проблема (до рефакторинга): Код выполнял запросы и замерял время, но не было явной структуры для сравнения производительности оптимизированных и неоптимизированных запросов или для управления индексами.

Решение (рефакторинг): Создание модуля index_manager.py и структуры в main.py для запуска различных тестов (сравнение неэффективных и эффективных запросов) и анализа планов выполнения подготовило код к дальнейшей оптимизации производительности и проведению более структурированного тестирования.

Рисунок 14. Загрузка всех изменений на гит.

Вывод

В ходе выполнения лабораторной работы был проведен рефакторинг монолитного Python-скрипта, работающего с базой данных SQLite, на модульную структуру с разделением ответственности. Это позволило значительно улучшить организацию, читаемость и поддерживаемость кода, выделив логику взаимодействия с базой данных, генерации данных, управления индексами и выполнения SQL-запросов в отдельные файлы. Проведенные оптимизации SQL-запросов и использование индексов продемонстрировали существенное влияние на производительность выполнения операций выборки, что является ключевым аспектом эффективной работы с базами данных.

Ссылка на гит - https://github.com/andsee18/refactlab5

Соседние файлы в предмете Рефакторинг