Материал для ознакомления. Эксперимент поставлен некорректно.
Методология исследования
Тестовая среда и инструменты:
- СУБД: PostgreSQL 17
- Условия тестирования: параллельная нагрузка, ресурсоемкий запрос
Нагрузка на СУБД
1️⃣Эксперимент-1 : Оптимизация с использованием EXISTS
2️⃣Эксперимент-2 : Оптимизация структуры запроса
3️⃣Эксперимент-3 : Частичная агрегация
4️⃣Эксперимент-4 : Временная таблица
Тестовый запрос - TEMP TABLE
План выполнения тестового запроса -TEMP TABLE
Сравнительный анализ планов выполнения запросов
❓Проведи сравнительный анализ и сформируй итог по планам выполнения тестовых запросов
Ключевые различия:
1.Подход к работе с данными:
TEMP TABLE: Использует временную таблицу с предварительной фильтрацией и индексами
2.Использование ресурсов
TEMP TABLE: Меньше дисковых операций сортировки (109,672 kB)
Оба запроса используют external merge сортировку из-за большого объема данных
3.Операции в плане
TEMP TABLE: Разделяет логику - сначала фильтрация во временную таблицу, затем JOIN
4.Чтение данных
TEMP TABLE: Работает с уже отфильтрованными строками во временной таблице
Итоговый вывод:
ℹ️TEMP TABLE показывает лучшую производительность благодаря:
- Разделению ответственности: Фильтрация данных выполняется один раз и сохраняется
- Эффективному использованию индексов: Индексы на временной таблице ускоряют JOIN операции
- Уменьшению сложности запроса: Основной запрос становится проще для оптимизатора
- Снижению стоимости случайного выбора: ORDER BY RANDOM() выполняется один раз при создании временной таблицы
ℹ️Подход TEMP TABLE более масштабируем и предсказуем по производительности, особенно при работе с большими объемами данных.
Сравнительный анализ производительности и ожиданий СУБД в ходе нагрузочного тестирования при использовании запроса "JOIN" и запроса "TEMP TABLE"
Операционная скорость
⬆️Среднее увеличение операционной скорости при использовании запроса "TEMP TABLE" составило 1406.03%
Ожидания СУБД
❓Проведи сравнительный анализ и сформируй итог по показаниям wait_event_type для тестовых запросов
Сравнительный анализ показаний wait_event_type
Ключевые различия в паттернах ожиданий:
"TEMP TABLE":
1️⃣Низкие значения IO:
- Начинается с 361, достигает максимум 1276
В 10-12 раз меньше, чем в JOIN
2️⃣Минимальный IPC:
- Начинается с 632, затем падает до 0-5
Практически отсутствует межпроцессное взаимодействие
3️⃣Стабильные LWLOCK:
- В основном 1-2, иногда до 5
Минимальные блокировки
4️⃣Минимальные TIMEOUT:
- В основном 0-1, изредка 4
Практически отсутствуют таймауты
Итоговый вывод:
"TEMP TABLE" демонстрирует значительно более эффективное использование системных ресурсов:
Преимущества "TEMP TABLE":
- На 88-95% меньше IO ожиданий - эффективная работа с диском
- На 99% меньше IPC ожиданий - минимальное межпроцессное взаимодействие
- На 95% меньше LWLOCK - минимальные блокировки
- На 95% меньше TIMEOUT - предсказуемое время выполнения
Подход "TEMP TABLE" не только быстрее (41% ускорение), но и значительно менее ресурсоемкий, что делает его более масштабируемым и стабильным решением.
Сравнительный анализ метрик iostat для дискового устройства используемого файловой системой /data, в ходе нагрузочного тестирования при использовании запроса "JOIN" и запроса "TEMP TABLE"
❓Проведи сравнительный анализ и сформируй итог по показаниям iostat для тестовых запросов в ходе нагрузочного тестирования
Одинаковая картина для обоих тестов:
- Отсутствие дисковой нагрузки.
- Работа в памяти: Все операции выполняются в оперативной памяти.
Сравнительный анализ метрик vmstat в ходе нагрузочного тестирования при использовании запроса "JOIN" и запроса "TEMP TABLE"
❓Проведи сравнительный анализ и сформируй итог по показаниям vmstat для тестовых запросов в ходе нагрузочного тестирования
1. Процессы (Processes):
- LEFT JOIN: procs_r (работающие процессы) 4-9, procs_b (блокированные) 1-2
- TEMP TABLE: procs_r 6-15, procs_b отсутствует в данных
LEFT JOIN имеет блокированные процессы, что указывает на ожидание ресурсов
2. Память (Memory):
- LEFT JOIN:
swpd (своп): 203-217 → стабильно низкий
free (свободно): 179-182 → стабильно
buff (буферы): 10-106 → значительные колебания
cache (кэш): 6800-7100 → высокий уровень кэширования
- TEMP TABLE:
swpd: 213-214 → стабильно
free: 209-460 → значительно больше свободной памяти
buff: 40-193 → умеренный рост
cache: 6400-6900 → эффективное использование кэша
3. Ввод-вывод (I/O):
- LEFT JOIN:
bi (блоков ввода): 31-87036 → экстремальные значения
bo (блоков вывода): 3474-7329 → высокие значения
- TEMP TABLE:
bi: 24-58 → стабильно низкие
bo: 38529-62982 → высокие, но стабильные
4. Системные вызовы:
- LEFT JOIN:
in (прерывания): 10097-14285 → очень высокие
cs (переключения контекста): 9511-13765 → высокие
- TEMP TABLE:
in: 6051-8858 → значительно ниже
cs: 1106-1890 → на порядок ниже
5. Использование CPU:
- LEFT JOIN:
us (пользователь): 35-57% → высокое и возрастающее
sy (система): 4-5% → стабильно
id (простой): 17-47% → снижается со временем
wa (ожидание I/O): 10-17% → высокое и растущее
- TEMP TABLE:
us: 60-95% → очень высокое, особенно в конце
sy: 3-5% → стабильно
id: 0-36% → снижается до 0%
wa: 0-1% → практически отсутствует
Анализ паттерна 'TEMP TABLE":
Эффективное использование CPU:
- Практически отсутствие ожидания I/O (0-1%)
- Высокое использование пользовательского CPU (до 95%)
Низкие системные издержки:
- Значительно меньше прерываний и переключений контекста
Более эффективная работа
- Стабильная работа с памятью:
- Больше свободной памяти
- Стабильное использование кэша
Общий итог : Часть-4 "TEMP TABLE"
ℹ️Для условий высокой параллельной нагрузки и конкуренции за вычислительные ресурсы, с точки зрения производительности СУБД - использование временной таблицы оказывает кардинальное влияние на увеличение производительности СУБД .
Производительность СУБД:
⬆️Среднее увеличение операционной скорости при использовании запроса "TEMP TABLE" составило 1406.03%💥
❓Сформируй общий итог о сравнении производительности и показателей инфраструктуры в ходе нагрузочного тестирования.
Общий итог сравнения производительности и показателей инфраструктуры
1. Кардинальное улучшение производительности
Подход с временной таблицей демонстрирует:
- Рост операционной скорости на 1406%
2. Эффективное использование ресурсов СУБД
Использование временной таблицы обеспечивает:
- На 92-99% меньше ожиданий (IO, IPC, блокировки)
- Минимальные таймауты выполнения
- Упрощенные планы выполнения запросов
3. Оптимизация системных ресурсов
- На 94% меньше ожидания I/O (CPU не простаивает)
- На 90% больше свободной памяти
- На 87% меньше переключений контекста
- Отсутствие блокированных процессов
4. Масштабируемость и стабильность
- TEMP TABLE показывает линейный рост производительности
- Нет экспоненциального роста системных издержек
- Предсказуемое поведение под нагрузкой
Технические преимущества подхода TEMP TABLE
Для СУБД:
- Разделение сложных операций - фильтрация и соелинение выполняются отдельно
- Эффективное использование индексов - специализированные индексы на временных данных
- Упрощение оптимизатора - более простые планы выполнения
Для инфраструктуры:
- Снижение нагрузки на I/O - минимизация дисковых операций
- Оптимальное использование памяти - эффективное кэширование
- Снижение системных издержек - меньше прерываний и переключений
Заключение
ℹ️Подход с использованием временных таблиц (TEMP TABLE) является оптимальным решением для сложных аналитических запросов в условиях высокой параллельной нагрузки.
Он обеспечивает:
- Значительный прирост производительности (до 1406% по операционной скорости)
- Эффективное использование ресурсов системы и СУБД
- Высокую масштабируемость и стабильность работы
- Предсказуемое поведение под нагрузкой
Данная методика особенно рекомендована для:
- Отчетных систем с большими объемами данных
- OLAP-нагрузок в OLCP-средах
- Систем, требующих сложной аналитики в реальном времени
- Сред с ограниченными ресурсами I/O
ℹ️Результаты тестирования подтверждают, что оптимизация на уровне запросов (использование временных таблиц) может дать большее улучшение производительности, чем простое увеличение аппаратных ресурсов.
Продолжение цикла "Сравнительный анализ методов оптимизации ресурсоёмкого SQL-запроса под конкурентной нагрузкой с использованием pg_expecto":
5️⃣Часть-5: Оптимизация с помощью WHERE