DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Повышение производительности

Предположим, что наши требования опять изменились (что совсем неудивительно, не правда ли?). Теперь нужно создать политику так, что-
1 Здесь значение переменной l_str будет перезаписываться при каждой итерации цикла вместо конкатенации. Необходимо писать l_str := l_str | | '''' || emprec.ename ||''',';. - Примеч. науч. ред.
бы все пользователи и подразделения были доступны для пользователя, являющегося руководителем. Для других пользователей должны быть видны только сотрудники их подразделения. Для соответствия таким требованиям функция политики должна выглядеть следующим образом:

Посмотрите, какой сложной стала выборка данных. Эта сложность, несомненно, увеличит время отклика (а в реальных приложениях логика, конечно, будет значительно сложнее). Можно ли упростить код и повысить производительность?
Конечно. Обратимся к первому требованию: проверке того, является ли служащий руководителем. В приведенном выше коде такая проверка проводилась по таблице EMP, но ведь смена должности с неруководящей на руководящую происходит не очень часто. Кроме того, возможен карьерный рост руководителя, но статус его как руководителя при этом не меняется. В реальности звание руководителя похоже на атрибут, с которым пользователь входит в систему и который не изменяется в течение сеанса. Поэтому, если при входе в систему передать базе данных сведения о том, что пользователь является руководителем, то функции политики уже не придется проводить такую проверку.
Как передать подобное значение? Можно использовать глобальные переменные. Можно обозначить статус руководителя значением Y или N и создать пакет для хранения переменной.


Обратите внимание на то, насколько меньший объем кода требуется для проверки статуса руководителя. Статус проверяется по глобальной переменной пакета. Эта переменная должна быть задана на этапе входа пользователя в систему, и эту задачу отлично может выполнить триггер базы данных AFTER LOGON.

Триггер устанавливает значение переменной пакета для обозначения руководящего статуса служащего, которое затем попадает в функцию политики. Давайте проведем быстрый тест. Подключившись от имени пользователя King (который является руководителем) и пользователя Martin (который таковым не является), посмотрим, как это работает.


Запрос для Martin извлек не всех пользователей (как и предполагалось), в то время как запрос для King извлек все строки.
Использование переменных пакета часто может приводить к значительному повышению производительности. В первом примере, когда проверка статуса руководителя проводилась внутри функции политики, запрос выполнялся 1,99 секунды. Использование глобальных переменных приводит к сокращению времени выполнения запроса до 1,32 секунды, что значительно лучше.
 









jAntivirus