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

         

Меры по уменьшению нагрузки на ЦП


Для уменьшения нагрузки на ЦП в вашей системе баз данных можно предпринять некоторые меры:

  • Перепишите все коррелированные подзапросы, используя встраиваемые представления. Рассмотрим пример:

ПЕРЕД:

Запрос:

select outer.* from emp outer where outer.sal > (select avg(inner.sal) from emp inner where inner.deptno = outer.deptno);

Вывод Tkprof:

call count cp elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ------- Parse 1 0.02 0.02 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 3278 14.94 33.95 1666 5946 80 49152 ------- ------ -------- ---------- ---------- ---------- ---------- ------- total 3280 14.96 33.97 1666 5946 80 49152

План выполнения:

Rows Row Source Operation -------- --------------------------------------------------- 49152 FILTER 114689 TABLE ACCESS FULL EMP 6 SORT AGGREGATE 114688 TABLE ACCESS FULL EMP

Rows Execution Plan -------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 49152 FILTER 114689 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP' 6 SORT (AGGREGATE) 114688 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP'

Замечание:

Досадно смотреть на текст плана выполнения приведенного выше запроса, не обнаружив в нем даже никаких намеков на количество фактически выполненных коррелированных подзапросов. Если вы хотите направить в 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;

Вывод Tkprof:

call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- -------- ---------- Parse 1 0.02 0.02 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 3278 11.94 20.53 844 4602 40 49152 ------- ------ -------- ---------- ---------- ---------- -------- ---------- total 3280 11.96 20.55 844 4602 40 49152


План выполнения:

Rows Row Source Operation --------- --------------------------------------------------- 49152 HASH JOIN 3 VIEW 3 SORT GROUP BY 114688 TABLE ACCESS FULL EMP 114688 TABLE ACCESS FULL EMP

Rows Execution Plan -------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 49152 HASH JOIN 3 VIEW 3 SORT (GROUP BY) 114688 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP' 114688 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP'

Замечание:

Для небольшой таблицы в базе данных 8.1.7 моего настольного компьютера с Windows NT 4.0 с одним одновременно работающим пользовательским сеансом фактически сбережено 3 секунды времени ЦП (14.96 - 11.96). Теперь пересчитайте это для вашей промышленной базы данных с большим количеством одновременно работающих пользователей. После переписывания коррелированных подзапросов, используя встраиваемые представления, вы получите, по крайней мере, два результата:


  1. вы написали существенно лучший и масштабируемый код; вы обнаружите, что по мере роста размеров таблиц уменьшение производительности будет линейным;
  2. в зависимости от размера таблиц, с которыми работают коррелированные подзапросы, и количества пользователей, одновременно выполняющих эти запросы, вы сбережете значительный объем ресурсов ЦП.


  • Для всех объектов в ваших табличных пространствах используйте экстенты одинакового размера, это позволит предотвратить объединение свободного пространства, выполняемое SMON. Для этих же целей в параметре хранения по умолчанию PCTINCREASE устанавливайте 0.
  • Используйте локально управляемые табличные пространства (в Oracle8i и выше), это позволит предотвратить объединение свободного пространства, выполняемое SMON.
  • Выключите автоматическое объединение свободного пространства, выполняемое SMON. Для этого вы можете установить соответствующее событие в init.ora. Дополнительную информацию поищите в Metalink или обратитесь в службу поддержки Oracle. Делайте это только после реализации экстентов одинакового размера для всех объектов в вашей базе данных.
  • Избегайте использовать в сегментах отката опцию OPTIMAL, регулярно выполняйте ручное сокращение (shrinking) сегментов отката, если обнаруживаете недостаточность дискового пространства.



  • Содержание раздела