Ответ
Профилировщик SQL анализирует выполнение запросов к базе данных, предоставляя ключевую информацию для оптимизации:
- Время выполнения: Общая длительность и затраты времени на отдельные этапы (парсинг, планирование, выполнение).
- План выполнения (EXPLAIN): Последовательность операций, выбранных СУБД: тип доступа (сканирование таблицы / индекс), методы соединения (Nested Loops, Hash Join, Merge Join), порядок обработки.
- Использование ресурсов: Загрузка CPU, операции ввода-вывода (I/O), потребление памяти.
- Выявление проблемных запросов: Список самых медленных или самых частых запросов.
- Блокировки и взаимоблокировки (deadlocks): Информация о конфликтах параллельного доступа.
Пример анализа плана запроса в Java-приложении:
// Включение логирования SQL в Hibernate
// application.properties / hibernate.cfg.xml:
# hibernate.show_sql=true
# hibernate.format_sql=true
# hibernate.use_sql_comments=true
// Явное получение плана выполнения через EXPLAIN (PostgreSQL/MySQL)
Session session = entityManager.unwrap(Session.class);
session.doWork(connection -> {
String explainQuery = "EXPLAIN ANALYZE SELECT * FROM users WHERE active = true";
try (Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(explainQuery)) {
while (rs.next()) {
System.out.println("PLAN: " + rs.getString(1)); // Вывод плана
}
}
});
Практический совет: Регулярный анализ планов выполнения помогает находить отсутствующие индексы, неоптимальные соединения и "узкие" места.