#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 отображает оба числа одинаково.)