Какие данные показывает профилировщик SQL-запросов?

«Какие данные показывает профилировщик SQL-запросов?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Профилировщик 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)); // Вывод плана
        }
    }
});

Практический совет: Регулярный анализ планов выполнения помогает находить отсутствующие индексы, неоптимальные соединения и "узкие" места.