Третье ограничение более жесткое и означает, что каждое обращение к внешней программе влечет за собой минимум два переключения контекста на уровне сервера. В каждой современной операционной системе, с которыми мы знакомы, это может существенно повлиять на производительность. По сути дела, это означает, что обращения должны осуществляться при обработке значительных событий, а не для "отсеивания" строк при полном сканировании таблицы.
Совет:
Когда SGL-программа необходима для вычисления какого-либо значения, которое часто используется в операциях запроса, мы обычно рекомендуем, чтобы это значение вычислялось во время вставки и обновления и хранилось с записью, к которой оно относится. Естественным исключением является случай, когда производятся частые обновления в других таблицах, которые изменяют полученное значение. Отметим, что здесь наша рекомендация совпадает с приведенной нами для Oracle?.
Пример применения ЗОЬ-программы
На рис. 3.1 изображена схема выполнения запроса, который обращается к ЗОЬ-программе, написанной на Коболе, а затем сам с помощью средства обратного вызова выдает SQL в том же контексте, что и вызывающее приложение. Этот пример построен на большом приложении, обслуживающем аренду автомобилей, где в алгоритме определения цены по соображениям эффективности использовано несколько мегабайтов частного кэша. В Oracle? взаимодействие с ЗОЬ-программой обеспечивалось с помощью пакета DBMS_PIPE.
Традиционные ЗОЬ-программы классифицируются как "небезопасные", потому что обладают способностью опрашивать и изменять незащищенные ячейки памяти. Если вы работаете в процессе сервера Oracle, то можете испортить системную глобальную область (System Global Area — SGA), от которой полностью зависит правильное функционирование базы данных Oracle. Язык Java, напротив, считается "безопасным" (так как интерпретируется и работает под защитой Java Virtual Machine). По заявлению Oracle, в версии 8.1 внешние процедуры будут работать в рамках серверного процесса Oracle. Другими словами, выполнение Java (со средствами J/SQL для выполнения предложений SQL) станет сервисом, предоставляемым сервером Oracle. В результате схема, изображенная на рис. 3.1, будет более эффективной (рис. 3.2).
3. Некоторые усовершенствования в Oracle8	37