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

         

Поддержка приложений, использующих литералы


Значения 1234 и 5678 в двух примерах, показанных выше, являются константами (литералами), их использование в операторах SQL является причиной возникновения накладных расходов из-за допол-
нительных разборов и означает, что операторы SQL в библиотечном кеше не разделяются. Тем не менее при разработке многих приложений этому не уделяется должное внимание, поэтому в СУБД Oracle предусмотрено средство уменьшения влияния такого программирования на систему. Оно позволяет разделять в библиотечном кеше информацию о курсорах для тех операторов SQL, которые фактически не являются идентичными, но их различие заключается только в литералах. Реализация данного средства заключается в выполнении простого просмотра оператора SQL, во время которого все обнаруженные литералы заменяются переменными связывания. Этот просмотр выполняется перед фактическим шагом разбора, следовательно, когда СУБД будет разбирать два оператора, показанные выше, они будут заменены оператором, который будет иметь примерно следующий вид:

select * from emp where empno=:SYS_B_0

В этом операторе литерал был заменен переменной связывания, поэтому оператор станет разделяемым и полный разбор будет выполняться только один раз, соответственно уменьшая накладные расходы. Следовательно, даже для приложений, в которых не используются переменные связывания, средство автоматической замены литералов переменными связывания может принести пользу. Данный механизм управляется установкой в файле init.ora значений параметра cursor_sharing (разделение курсоров). Параметр может иметь следующие значения:

exact (точное соответствие)

Отключает данный механизм, то есть для операторов с разными литералами отключается разделение курсоров. Это значение устанавливается по умолчанию.

force (безусловное)

Включает механизм безусловного разделения операторов SQL, но только тех, которые имеют отличающиеся литералы.

similar (аналогичные операторы)

Разделение курсоров осуществляется тогда, когда известно, что оно не окажет никакого влияния на оптимизацию. Это значение не доступно в Oracle8i.

Этот параметр может быть установлен либо глобально в файле init.ora, либо динамически для всех сеансов с помощью оператора alter system или для конкретного сеанса с помощью оператора alter session. Его значение по умолчанию (exact) может быть изменено в будущих версиях СУБД Oracle.



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