Найти в Дзене
Postgres DBA

PG_HAZEL:Анализ различий в показателях производительности и семантическом сравнении SQL-запросов в PostgreSQL за разные временные интервалы.

Описание: INNER JOIN между таблицей пользователей и keycloak_userprofilekeycloak с фильтрацией: Вхождения: Описание: COUNT(*) из таблицы inbox_logs с фильтрацией по: Вхождения: Описание: COUNT(*) из таблицы attendee с фильтрацией: Вхождения: Описание: SELECT из users_user с условием atom_id = $1::uuid Вхождения: Описание: Сложный запрос с: Вхождения: Паттерн 1 2 Выборка superuser + keycloak JOIN 4 4 COUNT из inbox_logs 1 1 COUNT из attendee 1 1 Выборка по atom_id 1 1 Сложный JOIN транзакций 0 1 Вывод: Периоды идентичны, за исключением одного дополнительного сложного запроса в 2. Описание: UPDATE запросы, которые устанавливают пустой массив ролей для конкретных записей: Вхождения: Описание: UPDATE запросы с параметризованными значениями: Вхождения: Описание: UPDATE запросы для таблицы django_session: Вхождения: Паттерн 1 2 UPDATE keycloak_userprofilekeycloak (сброс ролей) 2 3 UPDATE user_extension_userextension 1 1 UPDATE django_session 1 0
Оглавление
1 + 1 иногда больше чем 2
1 + 1 иногда больше чем 2

Начало работ по теме

Задача

  1. Провести сравнительный анализ производительности и ожиданий СУБД между периодом штатной производительности(1) и периодом снижения производительности(2).
  2. Провести семантический анализ SQL запросов между периодом штатной производительности(1) и периодом снижения производительности(2).

Производительность и ожидания СУБД

-2
-3
-4
-5
-6

80% ожиданий (диаграмма Парето) по типу ожидания IPC

-7
-8

80% ожиданий (диаграмма Парето) по типу ожидания Lock

-9
-10

80% queryid (диаграмма Парето) по типу ожидания IPC

-11
-12

80% queryid (диаграмма Парето) по типу ожидания Lock

-13
-14

Семантический анализ SQL запросов по типу ожидания IPC

1. Паттерн: Выборка пользователей с JOIN таблицы keycloak_userprofilekeycloak и фильтрацией по роли superuser

Описание:

INNER JOIN между таблицей пользователей и keycloak_userprofilekeycloak с фильтрацией:

  • is_superuser = True
  • keycloak_roles LIKE '%superuser%'
  • LIMIT 1 с разными направлениями сортировки

Вхождения:

  • 1: 4 раза (3 с auth_user, 1 с users_user)
  • 2: 4 раза (3 с auth_user, 1 с users_user)

2. Паттерн: Подсчёт записей в таблице inbox_logs

Описание:

COUNT(*) из таблицы inbox_logs с фильтрацией по:

  • obj_id = '00301018'
  • obj_type = 0

Вхождения:

  • 1: 1 раз
  • 2: 1 раз

3. Паттерн: Подсчёт записей в таблице attendee

Описание:

COUNT(*) из таблицы attendee с фильтрацией:

  • user_id с конкретным UUID
  • status = 'PENDING'

Вхождения:

  • 1: 1 раз
  • 2: 1 раз

4. Паттерн: Выборка пользователя по atom_id

Описание:

SELECT из users_user с условием atom_id = $1::uuid

Вхождения:

  • 1: 1 раз
  • 2: 1 раз

5. Паттерн: Сложный запрос транзакций с множественными JOIN

Описание:

Сложный запрос с:

  • 1 INNER JOIN + 7 LEFT OUTER JOIN
  • Множественные таблицы: store_transactionhistory, store_transaction, store_userwallet, users_user, badges_action и др.
  • Сложные условия в WHERE с OR
  • Сортировка по created_at DESC

Вхождения:

  • 1: 0 раз
  • 2: 1 раз (уникальный)

Сводная таблица:

Паттерн 1 2

Выборка superuser + keycloak JOIN 4 4

COUNT из inbox_logs 1 1

COUNT из attendee 1 1

Выборка по atom_id 1 1

Сложный JOIN транзакций 0 1

Вывод: Периоды идентичны, за исключением одного дополнительного сложного запроса в 2.

Семантический анализ SQL запросов по типу ожидания Lock

1. Паттерн: Обновление таблицы keycloak_userprofilekeycloak - сброс ролей

Описание:

UPDATE запросы, которые устанавливают пустой массив ролей для конкретных записей:

  • SET "roles_and_permissions_as_dict" = '[]'
  • Фильтрация по конкретному ID: WHERE "id" = <число>

Вхождения:

  • 1: 2 раза
  • 2: 3 раза

2. Паттерн: Обновление таблицы user_extension_userextension

Описание:

UPDATE запросы с параметризованными значениями:

  • SET "info" = $1, "user_info" = $2
  • Фильтрация по UUID пользователя: WHERE "user_id" = $3::uuid

Вхождения:

  • 1: 1 раз
  • 2: 1 раз

3. Паттерн: Обновление сессии Django

Описание:

UPDATE запросы для таблицы django_session:

  • SET "session_data" = $1, "expire_date" = $2::timestamptz
  • Фильтрация по ключу сессии: WHERE "session_key" = $3

Вхождения:

  • 1: 1 раз
  • 2: 0 раз

Сводная таблица:

Паттерн 1 2

UPDATE keycloak_userprofilekeycloak (сброс ролей) 2 3

UPDATE user_extension_userextension 1 1

UPDATE django_session 1 0

Ключевые наблюдения:

  1. Общие элементы: Оба файла содержат одинаковые запросы к keycloak_userprofilekeycloak
  2. Уникальность:
  3. 1 содержит дополнительный запрос к django_session
  4. 2 содержит дополнительный запрос к keycloak_userprofilekeycloak
  5. Повторяемость: Паттерн сброса ролей в keycloak_userprofilekeycloak является наиболее частым в обоих файлах