Q: Есть ли хорошие способы объективно измерить производительность запроса в Oracle 10g?
- Трассировка Oracle - лучший способ измерения производительности. Выполните запрос и дайте возможность Oracle выполнить выполнение. В среде SQLPlus использовать AUTOTRACE очень просто.
http://asktom.oracle.com/tkyte/article1/autotrace.html (статья перемещена)
http://tkyte.blogspot.com/2007/04/when-explanation-doesn-sound-quite.html
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5671636641855
А включить трассировку Oracle в других средах не так сложно.
Q: Есть один конкретный запрос, который я настраивал в течение нескольких дней. Я получил версию, которая работает быстрее (по крайней мере, на основе моих первоначальных тестов), но стоимость EXPLAIN примерно такая же.
- Фактическое выполнение оператора - это то, что должно быть измерено. EXPLAIN PLAN неплохо предсказывает план оптимизатора, но на самом деле он не измеряет производительность.
Q: > 1. Насколько вероятно, что стоимость EXPLAIN чего-то не хватает?
- Не очень вероятно, но я видел случаи, когда EXPLAIN PLAN предлагает план, отличный от оптимизатора.
Q: > 2. Есть ли какие-либо конкретные ситуации, когда стоимость EXPLAIN непропорционально отличается от фактической производительности запроса?
- Короткий ответ: я не наблюдал ни одного. Но опять же, на самом деле нет прямой связи между стоимостью ОБЪЯСНИТЕЛЬНОГО ПЛАНА и фактической наблюдаемой производительностью. EXPLAIN PLAN может дать действительно большое число по стоимости, но фактический запрос будет выполнен менее чем за секунду. EXPLAIN PLAN не измеряет фактическую производительность запроса, для этого вам нужна трассировка Oracle.
Q: > 3. Я использовал подсказку first_rows в этом запросе. Имеет ли это влияние?
- Любая подсказка (например,
/*+ FIRST_ROWS */
) может повлиять на то, какой план выбран оптимизатором.
«Стоимость», возвращаемая ОБЪЯСНЕННЫМ ПЛАНОМ, является относительной. Это показатель эффективности, но не точный показатель. Вы не можете перевести число затрат в число операций с диском, количество секунд процессора или количество событий ожидания.
Как правило, мы находим, что оператор со стоимостью EXPLAIN PLAN, показанной как 1, выполняется «очень быстро», а оператор со стоимостью EXPLAIN PLAN порядка пяти или шести цифр может занять больше времени для запустить. Но не всегда.
Оптимизатор сравнивает множество возможных планов выполнения (полное сканирование таблицы, использование индекса, объединение во вложенных циклах и т. Д.). Оптимизатор назначает номер каждому плану, а затем выбирает план с наименьшим номером. .
Я видел случаи, когда план оптимизатора, показанный EXPLAIN PLAN, NOT соответствует фактическому плану, используемому при выполнении оператора. Я видел это десять лет назад с Oracle8, особенно когда в операторе использовались переменные связывания, а не литералы.
Чтобы получить фактическую стоимость выполнения выписки, включите трассировку для выписки.
Самый простой способ сделать это с помощью SQLPlus AUTOTRACE.
[http://asktom.oracle.com/tkyte/article1/autotrace.html][4]
Вне среды SQLPlus вы можете включить трассировку Oracle:
alter session set timed_statistics = true;
alter session set tracefile_identifier = here_is_my_session;
alter session set events '10046 trace name context forever, level 12'
--alter session set events '10053 trace name context forever, level 1'
select /*-- your_statement_here --*/ ...
alter session set events '10046 trace name context off'
--alter session set events '10053 trace name context off'
Это помещает файл трассировки в каталог user_dump_dest на сервере. Созданный файл трассировки будет иметь план оператора и все события ожидания. (Назначенный идентификатор файла трассировки включен в имя файла и облегчает поиск вашего файла в каталоге udump)
select value from v$parameter where name like 'user_dump_dest'
Если у вас нет доступа к файлу трассировки, вам потребуется помощь dba, чтобы получить доступ. (Dba может создать простой сценарий оболочки, который разработчики могут запускать с файлом .trc для запуска tkprof, и изменять разрешения для файла трассировки и вывода tkprof. Вы также можете использовать более новую версию trcanlzr. и.