2009-05-06 3 views
3

Есть ли хорошие способы объективно измерить производительность запроса в Oracle 10g? Есть один конкретный запрос, что я был tuning в течение нескольких дней. Я получил версию, которая работает быстрее (по крайней мере, на основе моих первоначальных тестов), но стоимость EXPLAIN примерно такая же.Насколько точны планы Oracle EXPLAIN PLAN?

  1. Насколько вероятно, что стоимость EXPLAIN отсутствует?
  2. Существуют ли особые ситуации, когда стоимость EXPLAIN непропорционально отличается от фактической производительности запроса?
  3. Я использовал подсказку first_rows по этому запросу. Это влияет?

ответ

11

Насколько вероятно, что стоимость EXPLAIN отсутствует?

Очень маловероятно. Фактически, это был бы уровень 1 ошибка:

Фактически, если ваша статистика значительно изменилась с момента запуска EXPLAIN, фактический план запроса будет отличаться. Но так как, поскольку запрос усложняется, план останется прежним.

Примечание EXPLAIN PLAN может показывать вам вещи, которые , вероятно,, чтобы произойти, но может не произойти в реальном запросе.

Мол, если вы запускаете EXPLAIN PLAN на иерархическом запросе:

SELECT * 
FROM table 
START WITH 
     id = :startid 
CONNECT BY 
     parent = PRIOR id 

с индексами на обоих id и parent, вы увидите дополнительные FULL TABLE SCAN, которые, скорее всего, не будет происходить в реальной жизни.

Использовать STORED OUTLINE чтобы сохранить и использовать план независимо от того, что.

Есть ли особые ситуации, когда стоимость EXPLAIN непропорционально отличается от фактической производительности запроса?

Да, это происходит очень часто при усложнении запросов.

CBO (оптимизатор, основанный на затратах) использует рассчитанную статистику для оценки времени запроса и выбора оптимального плана.

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

Вот конкретная ситуация вы спросили о: HASH JOIN, например, потребуется несколько проходов над probe table если хэш-таблица не будет вписываться в pga_aggregate_table, но по Oracle 10g, я не помню, когда-либо быть приняты в счет CBO.

Вот почему я намекаю каждый запрос Ожидаю, что заработает более 2 секунд в худшем случае.

Я использовал подсказку first_rows по этому запросу. Это влияет?

Эта подсказка сделает оптимизатор использовать план, который имеет более низкое ответа время: он возвращает первые строки как можно скорее, несмотря на общее время запроса быть больше.

Практически это почти всегда означает использование NESTED LOOP вместо HASH JOIN.

NESTED LOOP имеет более низкую общую производительность на больших наборах данных, но они быстрее возвращают первые строки (так как не нужно строить таблицу хэшей).

Что касается запроса от вашего original question, см. Мой ответ here.

+0

+1, xlnt, проницательный ответ, как обычно.Итак, вы спите с исходным кодом Oracle RDBMS под подушкой или что-то еще? ;-) – DCookie

+1

@DCookie: нет, меня просто укусила Том Ките, когда мне было 8 :) – Quassnoi

+0

С более сложными запросами оптимизатор рассмотрит все возможные пути или возьмет на себя прагматичную опцию отсечения, признав, что она может потенциально пропустить лучшее решение? Я все еще скучаю по старому оптимизатору, основанному на правилах. Вы знали, где вы были с оптимизатором на основе правил (mutter, mumble) ... –

1

AFAIK, EXPLAIN использует статистику по базе данных для расчета стоимости, поэтому она может определенно отличаться от фактической.

0

По моему опыту EXPLAIN был точен и полезен. Если бы это было не так, это не был бы полезным инструментом. Когда вы последний раз анализировали таблицы? Я видел, где план объяснения был почти таким же до и после анализа, но анализ сделал огромный прирост производительности.

6

Вопрос: Есть ли хорошие способы объективного измерения производительности запроса в 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. оба.

Смежные вопросы