Вопрос: Есть ли хорошие способы объективного измерения производительности запроса в Oracle 10g?
- Oracle tracing - лучший способ измерения производительности. Выполните запрос и дайте 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 след в других средах, не так уж трудно.
Вопрос: Есть один конкретный запрос, который я настраивал на несколько дней. Я получил версию, которая работает быстрее (по крайней мере, на основе моих первоначальных тестов), но стоимость EXPLAIN примерно такая же.
- Фактическое выполнение инструкции - это то, что необходимо измерить. EXPLAIN PLAN делает достойную работу по прогнозированию плана оптимизатора, но на самом деле это не измерение производительность.
Вопрос:> 1. Насколько вероятно, что стоимость EXPLAIN отсутствует?
- Не очень вероятно, но я видел случаи, когда EXPLAIN PLAN разрабатывает другой план, чем оптимизатор.
Вопрос:> 2. Существуют ли какие-либо конкретные ситуации, когда стоимость EXPLAIN непропорционально отличается от фактической производительности запроса?
- Короткий ответ заключается в том, что я его не заметил. Но опять же, нет реальной корреляции между стоимостью EXPLAIN PLAN и фактической наблюдаемой производительностью. Возможно, чтобы EXPLAIN PLAN дал действительно большое количество затрат, но чтобы выполнить фактический запрос менее чем за секунду. ПЛАН EXPLAIN не измеряет фактическую производительность запроса, для этого вам нужен трассировка Oracle.
Вопрос:> 3. Я использовал подсказку first_rows по этому запросу. Это влияет?
- Любые подсказки (например,
/*+ FIRST_ROWS */
) могут влиять на то, какой план выбирает оптимизатор.
"стоимость", возвращенное ПЛАНА EXPLAIN относительна. Это показатель производительности, но не точный показатель. Вы не можете перевести номер стоимости на несколько операций с дисками или количество секунд процессора или количество ожидающих событий.
Обычно мы находим, что инструкция с показателем EXPLAIN PLAN, показанная как 1, будет работать «очень быстро», а инструкция с стоимостью PLUS EXPLAIN порядка пяти или шести цифр займет больше времени бежать. Но не всегда.
Что делает оптимизатор, это сравнение множества возможных планов выполнения (полное сканирование таблицы, использование индекса, объединение вложенного цикла и т. Д.) Оптимизатор назначает номер для каждого плана, а затем выбирает план с наименьшим номер.
Я видел случаи, когда план оптимизатора, показанный 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. оба.
+1, xlnt, проницательный ответ, как обычно.Итак, вы спите с исходным кодом Oracle RDBMS под подушкой или что-то еще? ;-) – DCookie
@DCookie: нет, меня просто укусила Том Ките, когда мне было 8 :) – Quassnoi
С более сложными запросами оптимизатор рассмотрит все возможные пути или возьмет на себя прагматичную опцию отсечения, признав, что она может потенциально пропустить лучшее решение? Я все еще скучаю по старому оптимизатору, основанному на правилах. Вы знали, где вы были с оптимизатором на основе правил (mutter, mumble) ... –