Как видим из формулы (1), итоговая стоимость получается путем умножения оценок на среднюю скорость выполнения операции в данной системе. Средняя скорость выполнения операций в разных системах будет разной. Поэтому запрос 1, имеющий стоимость Cost в системе 1 будет иметь другую стоимость в системе 2. Или переходя к векторному обозначению, система 1 и система 2 будут иметь разные базисы. Для сравнения векторов стоимости в этих системах их нужно привести к одному базису. При этом одного значения длины вектора Cost будет недостаточно - необходимо знать все компоненты вектора и все оценки времени выполнения операций в системе. Только в случае одинаковых значений (#sreadtim, #mreadtim, #CPUSpeed) можно сравнивать стоимости выполнения запросов.
С точки зрения корректности сравнения стоимостей разными системами можно считать не только разные физически системы, но и одну и ту же физическую систему в разные моменты времени. Это происходит вследствие того, что базисный вектор в разные моменты времени может иметь разные значения (#sreadtim, #mreadtim, #CPUSpeed) - например, в случае изменения настроек или обновления системной статистической информации.
Пример 2. Стоимость запроса в разных системах
/* Тестовая система */
test@ORA9i> execute dbms_random.seed(0);
PL/SQL procedure successfully completed.
test@ORA9i> create table t1 2 as select 3 rownum id, 4 trunc(100*dbms_random.normal) val 5 from all_objects, all_objects 6 where rownum < 1000*1000 7 ;
Table created.
... Я Сбор статистики
test@ORA9i> set autotrace traceonly explain test@ORA9i> select count(*) from t1;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=784 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'T1' (Cost=784 Card=999999)
/* Рабочая система */
work@ORA9i> select count(*) from t1;
Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1062 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'T1' (Cost=1062 Card=999999)
/* Параметры рабочей системы */
work@ORA9i> set autotrace off; work@ORA9i> select pname, pval1 2 from sys.aux_stats$ 3 where sname= 'SYSSTATS_MAIN';
PNAME PVAL1 ------------------------------ ---------- CPUSPEED 151 MAXTHR 85332992 MBRC 7 MREADTIM 3,188 SLAVETHR -1 SREADTIM 1,84
6 rows selected.