Сценарий 06: Анализ производительности

Сценарий 06: Анализ производительности

Инженер по производительности выявляет узкие места и возможности для оптимизации.

Быстрый старт

# Выберите сценарий производительности
/select 06

Анализ сложности

Поиск «горячих» функций

> Найти функции с наибольшей цикломатической сложностью

╭─────────────── Отчёт по сложности ───────────────────────────╮
                                                              
  Топ-10 самых сложных функций:                               
                                                              
  #  Функция                    Сложность  Строки  Файл        
  ─────────────────────────────────────────────────────────── 
  1  exec_simple_query           47          234    postgres.c
  2  ExecInitNode                32          189    execProc..
  3  parse_analyze               28          156    analyze.c 
  4  standard_ProcessUtility     26          312    utility.c 
  5  heap_insert                 24          178    heapam.c  
                                                              
  Средняя сложность: 8.4                                       
  Функций со сложностью > 20: 23                               
  Функций со сложностью > 30: 5                                
                                                              
╰──────────────────────────────────────────────────────────────╯

Обнаружение глубокой вложенности

> Найти функции с глубокой вложенностью циклов

╭─────────────── Анализ вложенности ───────────────────────────╮
│                                                              │
│  Функции с глубиной вложенности > 4:                          │
│                                                              │
│  🔴 join_search_one_level()     глубина: 6                   │
│     Расположение: src/backend/optimizer/path/joinrels.c:89   │
│     Паттерн: Тройная вложенность циклов с условиями           │
│     Влияние: O(n³) в худшем случае                           │
│                                                              │
│  🟡 ExecHashJoinImpl()          глубина: 5                   │
│     Расположение: src/backend/executor/nodeHashjoin.c:234    │
│     Паттерн: Вложенный цикл с логикой повтора                │
│                                                              │
│  Рекомендации по оптимизации доступны для 12 функций          │
│                                                              │
╰──────────────────────────────────────────────────────────────╯

Анализ памяти

Паттерны выделения памяти

> Найти функции, выделяющие большой объём памяти

╭─────────────── Анализ выделения памяти ─────────────────────╮
│                                                              │
│  Функции с высоким выделением памяти:                        │
│                                                              │
│  Функция                   Выделения  Контекст               │
│  ────────────────────────────────────────────────────────────│
│  ExecHashTableCreate        palloc x 15  HashMemoryContext   │
│  MakeTupleTableSlot         palloc x 8   Per-tuple           │
│  BuildTupleHashTable        palloc x 12  HashMemoryContext   │
│                                                              │
│  Горячие точки контекстов памяти:                            │
│    - HashMemoryContext: 45% выделений                        │
│    - MessageContext: 23% выделений                           │
│    - PortalContext: 18% выделений                            │
│                                                              │
│  Рекомендация: Проверить использование HashMemoryContext     │
│                                                              │
╰──────────────────────────────────────────────────────────────╯

Анализ частоты вызовов

Горячие пути

> Найти часто вызываемые функции при выполнении запроса

╭─────────────── Анализ частоты вызовов ──────────────────────╮
│                                                              │
│  Горячие функции (по количеству вызовов на типичный запрос): │
│                                                              │
│  Функция                 Вызовов/запрос   Кумулятивно        │
│  ────────────────────────────────────────────────────────────│
│  slot_getattr             ~10 000         Внутренний цикл    │
│  ExecQual                 ~5 000          Фильтрация строк   │
│  ExecProject              ~2 500          Проекция           │
│  ExecProcNode             ~1 000          Диспетчеризация узлов│
│                                                              │
│  Критический путь:                                           │
│  ExecutorRun → ExecProcNode → ExecScan → slot_getattr        │
│                                                              │
│  Фокус оптимизации: Функции внутреннего цикла                 │
│                                                              │
╰──────────────────────────────────────────────────────────────╯

Алгоритмические паттерны

O(n²) и хуже

> Найти потенциальные паттерны O(n²)

╭─────────────── Алгоритмическая сложность ───────────────────╮
│                                                              │
│  Потенциально квадратичные паттерны:                         │
│                                                              │
│  🔴 list_member() в цикле                                    │
│     Расположение: src/backend/catalog/dependency.c:456       │
│     Паттерн: Линейный поиск в цикле                          │
│     Решение: Использовать хеш-таблицу для проверки вхождения │
│                                                              │
│  🟡 bsearch во вложенном цикле                               │
│     Расположение: src/backend/optimizer/path/costsize.c:789  │
│     Паттерн: O(n log n) на итерацию                          │
│     Текущая сложность: O(n² log n)                           │
│                                                              │
│  Найдено паттернов: 8                                        │
│                                                              │
╰──────────────────────────────────────────────────────────────╯

Примеры запросов

  • «Найти функции с высокой сложностью»
  • «Показать горячие точки выделения памяти»
  • «Найти паттерны O(n²)»
  • «Какие функции вызываются чаще всего?»
  • «Найти функции с глубокой вложенностью»
  • «Показать критические пути выполнения»

Справочник метрик

Метрика Порог Действие
Цикломатическая сложность > 20 Рассмотреть разделение функции
Глубина вложенности > 4 Рефакторинг циклов
Длина функции > 200 строк Выделить подфункции
Выделений памяти на вызов > 10 Проверить использование памяти

Связанные сценарии