Суффикс затрат в Oracle Explain Plans

#sql #oracle #performance

#sql #Oracle #Производительность

Вопрос:

У меня есть следующий фрагмент планов explain ниже:

Объясните план 1

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                    | Name                         | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                             |                              |        |       |       |    37M(100)|          |       |       |          |
...
|* 36 |    INDEX UNIQUE SCAN                         | ZX_ACCOUNTS_U2               |      1 |    36 |       |     0   (0)|          |  1025K|  1025K|          |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
  

Объясните план 2

 -----------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                    | Name                         | E-Rows |E-Bytes|E-Temp | Cost (%CPU)| E-Time   |  OMem |  1Mem | Used-Mem |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                             |                              |        |       |       |   879T(100)|          |       |       |          |
...
|* 39 |    INDEX UNIQUE SCAN                         | ZX_ACCOUNTS_U2               |      1 |    36 |       |     0   (0)|          |  1025K|  1025K|          |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
  

Насколько я знаю, общая стоимость плана Explain Plan 1 составляет 37 миллионов. Но я не уверен в стоимости Explain Plan 2. Это 879 тысяч? или это 879 триллионов?
Я попытался найти какую-нибудь документацию о суффиксах, но не смог ее найти.

Спасибо!

Комментарии:

1. Да, T — триллион. Обратите внимание, что вы не можете просто сравнивать стоимость между планами для двух разных операторов, если они не происходят из одной и той же трассировки 10053. Нет никакой гарантии, что план стоимостью 879 триллионов долларов займет больше времени для фактического запуска, чем план стоимостью 37 миллионов.

2. @JustinCave спасибо. да, это те же запросы, я просто экспериментирую с подсказками. Спасибо!

3. Однако, если вы добавляете подсказку, это не один и тот же запрос. Добавление подсказки может изменить способ расчета стоимости различных операций, поэтому вы не можете просто сравнить затраты и сделать вывод, что подсказка дает или не дает лучший план.

Ответ №1:

Объясните номера планов обычно соответствуют префиксам международной системы единиц измерения: K = килограмм, M = мега, G = гига, T = тера, P = peta и E = exa.

В схеме нумерации есть несколько странностей. В Explain plan используется заглавная буква «K» для «kilo», тогда как я ожидал бы использовать строчную букву «k». Существуют некоторые несоответствия при переключении Oracle между префиксами — K, M и G могут содержать четыре цифры, но T и P могут содержать только три. И «E» означает только «exa» для некоторых чисел; действительно большие числа всегда отображаются как «18E».

Ниже приведены различные входные и отображаемые номера, используемые DBMS_XPLAN.DISPLAY :

 Number of rows           Explain Plan Output
-----------------------  -------------------
9                        |     9 |
99                       |    99 |
999                      |   999 |
9999                     |  9999 |
99999                    | 99999 |
999999                   |   999K|
9999999                  |  9999K|
99999999                 |    99M|
999999999                |   999M|
9999999999               |  9999M|
99999999999              |    99G|
999999999999             |   999G|
9999999999999            |  9999G|
99999999999999           |    99T|
999999999999999          |   999T|
9999999999999999         |    10P|
99999999999999999        |   100P|
999999999999999999       |   999P|
9999999999999999999      |    10E|
99999999999999999999     |    18E|
999999999999999999999    |    18E|
9999999999999999999999   |    18E|
  

Ниже приведен код, который сгенерировал результаты:

 --Create sample table that is only used for statistics.
--drop table test1;
create table test1(a number);

--How does the DBMS_XPLAN.DISPLAY handle large numbers?
declare
    v_lines sys.odcivarchar2list;
    v_num_rows number;
begin
    dbms_output.put_line('Number of rows           Explain Plan Output');
    dbms_output.put_line('-----------------------  -------------------');

    --Repeat the process for many numbers.
    for i in 1 .. 22 loop
        --Increase the number of digits.
        v_num_rows := rpad('9', i, '9');

        --Change the stats.
        dbms_stats.set_table_stats(user, 'TEST1', numrows => v_num_rows);

        --Generate the explain plan.
        execute immediate 'explain plan for select * from test1';

        --Gather the explain plan.
        select plan_table_output
        bulk collect into v_lines
        from table(dbms_xplan.display);

        --Output the relevant part of the explain plan.
        --The row and column numbers may be different on your system.
        dbms_output.put(rpad(v_num_rows, 22, ' ') || '   ');
        dbms_output.put_line(substr(v_lines(6), 35, 9));
    end loop;
end;
/
  

(Я использовал количество строк вместо стоимости, потому что количеством строк намного легче манипулировать. Я почти уверен, что Oracle отображает оба числа одинаково.)