Базы данных Oracle - статьи


Сравнение стоимостей разных запросов.


Рассмотрим вопрос сравнения стоимостей разных запросов, выполняемых в одной системе. Пусть имеется два запроса выборки данных из таблицы с разными предикатами. Обратим внимание на оценки селективности предикатов отношений (оценки количества строк, выбираемых условием where <поле>=<значение>). В запросах имеются два предиката p1 и p2 с оценками селективности n1 и n2. Оценки селективности могут отличаться от реального количества выбранных строк. Если в результате выполнения запроса оказалось, что было выбрано n1реал и n2реал строк, то затраты ресурсов и, как следствие, время выполнения будет отличаться от оценочного на величину f(n1- n1реал) и f(n2- n2реал). Нет причин считать, что значения f(n1- n1реал) и f(n2- n2реал) будут равны. Так что разные запросы, имея одинаковую оценочную стоимость в силу разной величины ошибки оценки селективности, могут иметь разное время выполнения.

Пример 3. Стоимость и время выполнения разных запросов в одной системе

/* Тестовая система */

test@ORA9i> execute dbms_stats.gather_table_stats('sys','t1',null,100, false,'FOR ALL COLUMNS SIZE 1');

PL/SQL procedure successfully completed.

test@ORA9i> set autotrace on test@ORA9i> set timing on test@ORA9i> select count(*) from 2 (select id, count(*) from t1 where val between 100 and 300 group by id);

COUNT(*) ---------- 157393

Elapsed: 00:00:03.01

Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3705 Card=1) 1 0 SORT (AGGREGATE) 2 1 VIEW (Cost=3705 Card=219060) 3 2 SORT (GROUP BY) (Cost=3705 Card=219060 Bytes=1752480) 4 3 TABLE ACCESS (FULL) OF 'T1' (Cost=884 Card=219060 Bytes=1752480)

test@ORA9i> select count(*) from 2 (select id, count(*) from t1 where val between -100 and 100 group by id);

COUNT(*) ---------- 687375

Elapsed: 00:00:10.05

Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3705 Card=1) 1 0 SORT (AGGREGATE) 2 1 VIEW (Cost=3705 Card=219060) 3 2 SORT (GROUP BY) (Cost=3705 Card=219060 Bytes=1752480) 4 3 TABLE ACCESS (FULL) OF 'T1' (Cost=884 Card=219060 Bytes=1752480)

Обратите внимание, что в примере 3 запросы, имея одинаковую стоимость, включают разные предикаты between 100 and 300 и between -100 and 100, поэтому эти запросы разные. Что и показывает отличие во времени выполнения в 3 раза.

Резюмируя можно сказать, что при сравнении стоимостей выполнения запросов необходимо учитывать особенности физической системы, на которой будет выполняться запрос, а также вероятностный характер оценки.




Начало  Назад  Вперед