Четверг
18.04.2024
13:48


Форма входа


Приветствую Вас Гость | RSS
Статьи по ORACLE, PL/SQL, Java и немного по SHELL (BASH),...
Главная Каталог статей Регистрация Вход
Главная » Статьи » ORACLE » ORACLE, PL/SQL

Использование DBMS_APPLICATION_INFO
Известно ли вам, что при выполнении длительной команды в Oracle, такой как CREATE INDEX или UPDATE для миллиона строк (длительная определяется как выполняемая дольше, чем за 3–5 секунд), динамически работающее представление V$SESSION_LONGOPS заполняется информацией? Это представление включает в себя следующую информацию:
  • Когда началось выполнение команды
  • Как долго она выполняется
  • Расчетное время завершения работы
DBMS_APPLICATION_INFO позволяет установить значения в представлении V$SESSION_LONGOPS. Это полезно делать при записи течения длительного процесса.
Вероятно, каждому разработчику хотелось бы, чтобы такая возможность существовала и в его собственных длительных хранимых процедурах или в других операциях. Что ж, начиная с версии 8.0 базы данных, DBMS_APPLICATION_INFO поможет найти ответы на вопросы:
  • Что делается в этой сессии, какая форма сейчас работает, какой программный модуль выполняется?
  • Как далеко продвинулась в своей работе эта хранимая процедура?
  • Как далеко продвинулось в своей работе это пакетное задание?
  • Какие значения переменных привязки были использованы в данном запросе?
DBMS_APPLICATION_INFO позволяет установить три столбца в строке таблицы V$SESSION: CLIENT_INFO, ACTION и MODULE. Функции могут не только устанавливать эти значения, но и возвращать их. К тому же во встроенных функциях USERENV и SYS_CONTEXT существует параметр, обеспечивающий доступ к столбцу CLIENT_INFO из любого запроса. В моем запросе я могу сделать, например, select userenv ('CLIENT_INFO') from dual или использовать where some_column = sys_context ('userenv', 'CLIENT_INFO'). Столбец MODULE должен хранить имя главного процесса, например имя пакета. Столбец ACTION подходит для хранения имени процедуры, которая выполняется в пакете.
 
ПРИМЕЧАНИЕ
Значения, устанавливаемые в таблицах V$, становятся видимыми немедленно. Нет необходимости фиксировать их для того, чтобы увидеть их и использовать при общении с внешним миром.

DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS
(
  rindex      => Указывает серверу, какую строку в представлении V$SESSION_LONGOPS
                 необходимо изменить. Если в качестве значения этого параметра указать
                 DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS_NOHINT, в это представление будет
                 автоматически вставлена новая строка, индекс которой будет записан в rindex.
                 При указании в последующих вызовах процедуры SET_SESSION_LONGOPS этого индекса
                 в качестве значения параметра rindex будет изменяться добавленная строка.
  slno        => Служебное значение. Первоначально надо передать значение NULL, а полученное
                 в результате выполнения значение — игнорировать. При каждом вызове надо передавать одно и то же значение.
  op_name     => Имя продолжительно выполняющегося процесса. Его длина не должна превышать 64 байт,
                 а в качестве значения необходимо задавать строку, по которой легко определить, что именно выполняется.
  target      => Обычно используется для передачи идентификатора объекта, с которым выполняется продолжительное
                 действие (например, идентификатор таблицы, в которую загружаются данные). Можно передать любое значение,
                 в том числе NULL .
  context     => Число, задаваемое пользователем. Это число должно быть информативным для пользователя.
                 Передать можно любое число.
  sofar       => В качестве значения можно передавать любое число, но если это число будет представлять собой
                 процент или другую количественную характеристику уже выполненной части действия, сервер сможет
                 автоматически оценить, сколько времени осталось до завершения действия. Например, если необходимо
                 обработать 25 объектов и на обработку каждого из них уходит примерно одинаковое время, можно
                 задать в качестве значения параметра sofar количество обработанных объектов, а общее их количество
                 передать как следующий параметр, totalwork. Сервер определит, сколько времени потребовалось для
                 выполнения уже сделанной части, и оценит время, необходимое для завершения действия.
  totalwork   => В качестве значения можно передавать любое число, но имеет смысл сопоставлять его со значением
                 параметра sofar. Если sofar представляет собой процент от totalwork, отражающий ход выполнения действия,
                 сервер сможет вычислить, сколько времени осталось до завершения действия.
  target_desc => Этот параметр описывает значение target, представленное выше. Если в качестве параметра target передан
                 идентификатор объекта, параметр может содержать имя объекта с этим идентификатором.
  units       => Описательный параметр, задающий единицу измерения для значений параметров sofar и totalwork.
                 Это могут быть, например, файлы, итерации или вызовы.
)
PS. Уникальность записи идет по rindex
Данные вставленные в V$SESSION_LONGOPS:
  op_name, target, target_desc, units берутся по первому вызову DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS
  sofar, totalwork по последующим (последним)
  context сюда попадает передаваемое текущее значение

Ниже приводятся основные указания по использованию пакета DBMS_APPLICATION_INFO:
  • Применяйте вызов SET_CLIENT_INFO для сохранения полезной статистической информации в V$SESSION. Его можно использовать для данных, которые можно просмотреть, чтобы знать, что программа делает. Например, можно разместить в нем переменные привязки перед выполнением некоторого длительного запроса. Тогда любой, у кого есть доступ к таблице V$, не увидит SQL-запрос, но сможет просмотреть входные данные этого запроса.
  • При входе и выходе из подпрограмм PL/SQL используйте внутри вызов SET_MODULE/GET_MODULE. По крайней мере, в главной подпрограмме. В таком случае, запросив V$SESSION, можно увидеть, какая из подпрограмм выполняется в текущий момент. SET_MODULE позволяет установить два компонента в V$SESSION: столбцы MODULE и ACTION.
  • Используйте для подпрограмм, выполнение которых занимает больше, чем пару секунд, возможности SET_SESSION_LONGOPS. Это позволит отслеживать ход их выполнения. Вы сможете посмотреть, как далеко они продвинулись в своей работе, и рассчитать время, оставшееся до их завершения.
  • За более подробной информацией о пакете DBMS_APPLICATION_INFO обращайтесь к Oracle Supplied Packages Guide.

Источник: Глава из книги "Oracle: Эффективное проектирование приложений”

Категория: ORACLE, PL/SQL | Добавил: Akarak (10.11.2009)
Просмотров: 11840 | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *:
Меню сайта

Категории раздела
ORACLE, PL/SQL [36]
Скрипты DDL [3]
Скрипты по управлению объектами
Встроенные функции SQL [2]
Встроенные функции SQL

Интересные сайты
  • sql.ru
  • all-oracle.ru
  • oranet.ru
  • oracloid.ru
  • forum.vingrad.ru

  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0

    Поиск

    Copyright MyCorp © 2024
    Используются технологии uCoz