Досадно смотреть на текст плана выполнения приведенного выше запроса, не обнаружив в нем даже никаких намеков на количество фактически выполненных коррелированных подзапросов. Если вы хотите направить в Oracle Corporation запрос на совершенствование РСУБД, вот хороший совет: добавьте в текст плана выполнения количество выполненных коррелированных подзапросов.
ПОСЛЕ:
Запрос:
select emp.* from emp, (select deptno, avg(sal) avg_sal from emp group by deptno) davg_sal where emp.deptno = davg_sal.deptno and emp.sal > davg_sal.avg_sal;
Для небольшой таблицы в базе данных 8.1.7 моего настольного компьютера с Windows NT 4.0 с одним одновременно работающим пользовательским сеансом фактически сбережено 3 секунды времени ЦП (14.96 - 11.96). Теперь пересчитайте это для вашей промышленной базы данных с большим количеством одновременно работающих пользователей. После переписывания коррелированных подзапросов, используя встраиваемые представления, вы получите, по крайней мере, два результата:
вы написали существенно лучший и масштабируемый код; вы обнаружите, что по мере роста размеров таблиц уменьшение производительности будет линейным;
в зависимости от размера таблиц, с которыми работают коррелированные подзапросы, и количества пользователей, одновременно выполняющих эти запросы, вы сбережете значительный объем ресурсов ЦП.
Для всех объектов в ваших табличных пространствах используйте экстенты одинакового размера, это позволит предотвратить объединение свободного пространства, выполняемое SMON. Для этих же целей в параметре хранения по умолчанию PCTINCREASE устанавливайте 0.
Используйте локально управляемые табличные пространства (в Oracle8i и выше), это позволит предотвратить объединение свободного пространства, выполняемое SMON.
Выключите автоматическое объединение свободного пространства, выполняемое SMON. Для этого вы можете установить соответствующее событие в init.ora. Дополнительную информацию поищите в Metalink или обратитесь в службу поддержки Oracle. Делайте это только после реализации экстентов одинакового размера для всех объектов в вашей базе данных.
Избегайте использовать в сегментах отката опцию OPTIMAL, регулярно выполняйте ручное сокращение (shrinking) сегментов отката, если обнаруживаете недостаточность дискового пространства.