Как описать проблему производительности в реляционной базе данных?

У меня есть запрос, запущенный в реляционной базе данных , которая не соответствует ожиданиям пользователей.

Какую информацию я должен предоставить и чего следует избегать, чтобы я мог получить эффективную помощь на этом сайте?

    Для Oracle Database укажите следующую информацию:

    Опишите симптомы проблемы

    Опишите поведение, вызывающее проблему. Является ли поведение запроса стабильным или возникает проблема только иногда, с конкретными параметрами или просто случайными. Можете ли вы воспроизвести это поведение в среде IDE (например, SQL Developer)?

    Описать окружающую среду

    Определите точную версию Oracle

      select * from v$version 

    Опишите, как вы подключаетесь к базе данных: драйвер, ORM, язык программирования. Укажите имена и / или номера версий.

    Описать запрос

    Отправьте текст запроса. Попробуйте упростить – покажите минимальный воспроизводимый пример .

    Пример. Вы проблемный запрос объединяет 10 таблиц. Проверьте, видите ли вы те же симптомы в запросе с 9 или 8 соединениями. Выходите вниз, пока не увидите проблемы, и покажите только уменьшенный запрос.

    Да, это дорого, но это сильно увеличивает вероятность того, что вы получите поддержку! Чем меньше запрос, тем выше он привлекает сторонников.

    Описать план выполнения

    Чтобы получить план выполнения, запустите этот оператор (замените текст запроса)

      EXPLAIN PLAN SET STATEMENT_ID = '' into plan_table FOR select * from .... -- your query here ; 

    План выполнения хранится в PLAN_TABLE , чтобы увидеть, как он запускает этот запрос

      SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', '','ALL')); 

    Покажите полный результат (а не только таблицу с планом выполнения). Крайне важным может быть раздел предиката и примечания ниже.

    Пример для select * from dual where dummy = :1;

     Plan hash value: 272002086 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$1 / [email protected]$1 Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("DUMMY"=:1) Column Projection Information (identified by operation id): ----------------------------------------------------------- 1 - "DUMMY"[VARCHAR2,1] 

    Не разрезайте и не вставляйте графический результат плана объяснения IDE.

    Является ли этот план выполнения реальным, который выполняется?

    К сожалению, не всегда. Существует несколько причин, по которым объясненный план выполнения может отличаться от реального .

    Если вы сомневаетесь (особенно когда вы видите хороший план, но запрос работает не так), вы можете извлечь план из кеша БД, предоставляя SQL_ID .

      SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_CURSOR('',null,'ALL')) t; 

    SQL_ID для запроса, который в настоящее время запущен (или был запущен в ближайшее время и все еще кэширован), можно найти с совпадением текста и / или с пользователем базы данных:

     select sql_id, sql_fulltext from v$sql a where lower(sql_text) like lower('%%') and parsing_schema_name = ''; 

    Если у вас есть лицензия AWR, вы можете получить от нее план выполнения, даже для запросов, запущенных в истории.

     SELECT t.* FROM table(DBMS_XPLAN.DISPLAY_AWR('10u2rj016s96k' )) t; 

    SQL_ID можно найти, используя

     select sql_id, sql_text from dba_hist_sqltext a where lower(sql_text) like lower('%%') 

    Описать данные

    Покажите DDL таблиц и индексов в этих таблицах.

    Упомяните, если недавно собраны статистические данные оптимизатора, и покажите использованную dbms_stats .

    Для критической таблицы (-ов) предоставляется информация о размере сегмента, номере строки, разбиении на разделы, …

    Для столбцов, используемых в доступе или объединениях, предоставляется информация о количестве различных значений. Являются ли значения равномерно распределенными или искаженными (например, небольшое количество значений, которое происходит очень часто, и большое количество редких значений). Вы определяете гистограммы?

    Что-нибудь еще?

    Конечно, это только основные сведения, и может потребоваться другая информация, такая как статистика системы или параметры оптимизатора. Но еще раз попробуйте предоставить минимальную информацию, которая (ваша вещь) может идентифицировать проблему. Отправьте дополнительную информацию по запросу.

    Удачи!

    Давайте будем гением компьютера.