|
Программирование >> Oracle
1578 Приложение А или загрузка больших объемов данных,выполнение сложных запросов, требующих распараллеливания. При выполнении этих продолжительных действий информация о ходе работы записывается в представление динамической производительности V$SESSION LONGOPS, что позволяет оценить объем сделанного. Это представление можно использовать и в приложениях. В представлении отражается состояние действий, выполняющихся в базе данных более шести секунд. Другими словами, в функции сервера Oracle, которые, по предположению разработчиков, обычно выполняются дольше шести секунд, включены вызовы процедуры, вставляющей данные в представление V$SESSION LONGOPS. Это не означает, что при выполнении действия продолжительностью более шести секунд в это представление автоматически будет что-то записываться. К таким действиям сейчас относятся многие функции резервного копирования и восстановления, сбора статистической информации и выполнение запросов. В каждой новой версии Oracle появляются новые действия. Изменения в этом представлении сразу же доступны для других сеансов, т.е. транзакцию фиксировать не нужно. Можно контролировать ход процесса, изменяющего это представление, из другого сеанса с помощью запросов к представлению V$SESSION LONGOPS. Разработчики могут добавлять строки в это представление. Обычно приложение вставляет и изменяет одну строку, но при необходимости можно вставлять и несколько. Процедура для установки значений в этом представлении имеет следующие парамет- PROCEDURE SET SESSION LONGOPS Argument Name Type In/Out Default? RINDEX SLNO OP NAME TARGET CONTEXT SOFAR TOTALWORK TARGET DESC UNITS Эти параметры описаны ниже. BINARY INTEGER BINARY INTEGER VARCHAR2 BINARY INTEGER BINARY INTEGER NUMBER NUMBER VARCHAR2 VARCHAR2 IN/OUT IN/OUT IN IN IN IN IN IN IN DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT DEFAULT RINDEX. Указывает серверу, какую строку в представлении V$SESSION LONGOPS необходимо изменить. Если в качестве значения этого параметра указать DBMS APPICATION INFO.SET SESSION LONGOPS NOHINT, в это представление будет автоматически вставлена новая строка, индекс которой будет записан в RINDEX. При указании в последующих вызовах процедуры SET SESSION LONGOPS этого индекса в качестве значения параметра RINDEX будет изменяться добавленная строка. SLNO. Служебное значение. Первоначально надо передать значение NULL, а полученное в результате выполнения значение - игнорировать. При каждом вызове надо передавать одно и то же значение. Пакет DBMS APPLICATION INFO 1579 OP NAME. Имя продолжительно выполняющегося процесса. Его длина не должна превышать 64 байт, а в качестве значения необходимо задавать строку, по которой легко определить, что именно выполняется. TARGET. Обычно используется для передачи идентификатора объекта, с которым выполняется продолжительное действие (например, идентификатор таблицы, в которую загружаются данные). Можно передать любое значение, в том числе NULL. CONTEXT. Число, задаваемое пользователем. Это число должно быть информативным для пользователя. Передать можно любое число. SOFAR. В качестве значения можно передавать любое число, но если это число будет представлять собой процент или другую количественную характеристику уже выполненной части действия, сервер сможет автоматически оценить, сколько времени осталось до завершения действия. Например, если необходимо обработать 25 объектов и на обработку каждого из них уходит примерно одинаковое время, можно задать в качестве значения параметра SOFAR количество обработанных объектов, а общее их количество передать как следующий параметр, TOTALWORK. Сервер определит, сколько времени потребовалось для выполнения уже сделанной части, и оценит время, необходимое для завершения действия. TOTALWORK. В качестве значения можно передавать любое число, но имеет смысл сопоставлять его со значением параметра SOFAR. Если SOFAR представляет собой процент от TOTALWORK, отражающий ход выполнения действия, сервер сможет вычислить, сколько времени осталось до завершения действия. TARGET DESC. Этот параметр описывает значение TARGET, представленное выше. Если в качестве параметра TARGET передан идентификатор объекта, параметр может содержать имя объекта с этим идентификатором. UNITS. Описательный параметр, задающий единицу измерения для значений параметров SOFAR и TOTALWORK. Это могут быть, например, файлы, итерации или вызовы. Перечисленные выше значения может устанавливать пользователь. Если обратиться к представлению V$SESSION LONGOPS, то в нем можно обнаружить намного больше столбцов, чем описано выше:
1580 Приложение А ELAPSED SECONDS NUMBER CONTEXT NUMBER ** MESSAGE VARCHAR2(512) USERNAME VARCHAR2(3 0) SQL ADDRESS RAW(4) SQL HASH VALUE NUMBER QCSID NUMBER Значения столбцов, помеченных двумя звездочками (**), может устанавливать пользователь. Остальные столбцы имеют следующие значения. Столбцы SID и SERIAL# используются при соединении с представлением V$SESSION для получения информации о сеансе. Столбец START TIME содержит время создания записи (обычно это время первого вызова процедуры DBMS APPLICATION INFO.SET SESSION LONGOPS, с помощью которого и была создана строка). Столбец LAST UPDATE TIME представляет время последнего вызова процедуры SET SESSION LONGOPS. Столбец TIME REMAINING содержит предполагаемое время, оставшееся до завершения действия. Его значение вычисляется как: ROUND(ELAPSED SECONDS*((TOTALWORK/SOFAR)-1)). Столбец ELAPSED SECONDS содержит количество секунд, прошедших с начала выполнения продолжительного действия до последнего изменения строки. Столбец MESSAGE - производный. Он представляет собой конкатенацию значений столбцов OPNAME, TARGET DESC, TARGET, SOFAR, TOTALWORK и UNITS, описывающую выполняемое действие. Значение в столбце USERNAME - имя пользователя, выполняющего действие. Значения столбцов SQL ADDRESS и SQL HASH VALUE можно использовать для поиска в представлении V$SQLAREA последнего SQL-оператора, выполненного процессом. Значение столбца QCSID используется при распараллеливании запроса. Это идентификатор сеанса-координатора параллельного запроса. Итак, что же можно получить с помощью данного представления? Небольшой пример поможет прояснить это. Выполним в одном сеансе следующий блок кода: tkyte@TKYTE816> declare 2 l nohint number default dbms application info.set session longops nohint; 3 l rindex number default l nohint; 4 l slno number; 5 begin 6 for i in 1 .. 25 7 loop 8 dbms lock.sleep(2); 9 dbms application info.set session longops
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |