Oracle передача параметров между сессиями

Обновлено: 07.07.2024

В PL/SQL в любом случае можно вызвать несколько сеансов и одновременно выполнить процедуру на нескольких сеансах.

Я хочу использовать это в приложениях реального времени, где в приложение входит 250 пользователей. Пользователи подключаются к Oracle через клиентский инструмент. (Power Builder - это инструмент Front End)

Например, если пользователь вызывает хранимую процедуру, эта хранимая процедура должна выполняться 10 раз с разными значениями параметров.

Я не хочу запускать это последовательно один за другим 10 раз в том же сеансе, потому что это может занять много времени.

Я ищу способ, которым я могу запустить хранимую процедуру в 10 разных сеансах одновременно.

Я думал о размещении 10 заданий с использованием DBMS_JOB.SUBMIT, но из-за
тяжелая рабочая нагрузка (250 пользователей * 10 = 2500 заданий могут быть запланированы в планировщике заданий в одно и то же время и т.д.), наша группа DBA ищет другой лучший способ.

спросил(а) 2020-03-11T16:15:12+03:00 1 год, 8 месяцев назад

Альтернативно для создания JOB вы можете использовать DBMS_PARALLEL_EXECUTE пакет.

Вот некоторые хиты:

Используйте create_chunks_by_sql с by_rowid => FALSE , то есть используя идентификатор и создайте точное количество блоков как необходимое выполнение хранимой процедуры.

В run_task установите parallel_level в требуемую степень parallelism. Это то же самое число, что указано выше или ниже, если вам нужно o дросселировать parallelism.

Передайте вызов
процедура как параметр sql_stmt , например.

Необязательно, как вы видите, можно передать номер фрагмента в процедуру, поэтому вы можете использовать его как threadId .

Здесь полный пример

Создать задачу и 3 куска

Запустить задачу с помощью DOP = 3

Удалить задачу

ответил(а) 2020-03-11T16:33:27.063736+03:00 1 год, 8 месяцев назад

Чтобы избежать публикации нескольких заданий Oracle, вы можете попробовать использовать William Robertson Parallel PL/SQL launcher.

если вы создаете таблицу " PQ_DRIVER " с 4 разделами и параллельной степенью 4 с одной строкой в ​​каждом разделе и выполняете запрос по строкам " SELECT /*+ PARALLEL(pq,4) */ thread_id FROM pq_driver pq ", который должен убеждать PQ контроллер для установки четырех подчиненных процессов PQ для работы над ним (по одному на раздел). И если вы передадите этот запрос в качестве параметра курсора в конвейерную функцию с поддержкой параллелизма, то не следует ли создавать ситуацию, когда каждая строка обрабатывается отдельным ведомым процессом PQ? Итак, вот способ использования (хорошо, взломать) механизм PQ, чтобы он обрабатывал произвольные вызовы процедур PL/SQL параллельно.


Идея состоит в том, чтобы создать функцию, используя функции PARALLEL_ENABLE и PIPELINED :

Функция execute_command использует autonomous_transaction .

Oracle имеет временные таблицы, они практически бесполезны, кто думает не так, это их проблемы, я спорить тут не буду.
Приведенный ниже подход позволяет работать в рамках сессии Oracle с любым количеством переменных. Кто еще не понял, объясняю: Oracle имеет внутренний язык кроме SQL, они называют его PL/SQL и это совершенно разные вещи, то, что я описываю ниже относится именно к PL/SQL.

Основная идея, главный посыл: Oracle имеет в своем инструментарии такие вещи, как: PACKAGE и TYPE, это объекты базы данных, о них говорить можно много, но нас в данный момент интересует такое их свойство, как наличие доступных извне переменных. Объект TYPE я рассматривать не буду в данной статье, это отдельная тема разговора.

Объект: PACKAGE.
Выполните следующий код в системе, которая выполнение таких кодов разрешает (это может быть PL/SQL Developer, SQL Developer, TOAD и т.д. и т.п.):

В переводе на русский язык здесь написано следующее: создается заголовок пакета (его декларативная часть, больше вам ничего не надо), в пакете описывается запись из 15 полей по 5 полей на каждый тип: численный, символьный и тип DATETIME (до милисекунд), на основе этого типа записи декларируется таблица, которая индексируется через BINARY_INTEGER, такой тип необходим для того, чтобы с ним поддерживались операции BULK COLLECT, затем на основе этого типа создается еще один тип с типом индекса VARCHAR2(255), это техника для работы с хэш-массивами. В итоге декларируется переменная пакета на основе типа tempVar. Такой подход позволит вам иметь сколько угодно внутренних таблиц формата записи tempR к которым вы сможете обращаться через заданное имя.
Вот пример заполнения одного экземпляра таблицы через BULK COLLECT:

При таком заполнении, к сожалению, необходимо в конструкции SELECT полностью выдерживать структуру записи массива, иначе будет получена ошибка несоответствия запроса структуре его сохранения.
После того, как запрос отработает, в переменную пакета tempV будет записана таблица, ее можно получить разными способами, вот обычный блок PL/SQL:

Вот блок c Dynamic SQL:

Выше показан пример заполнения таблицы с помощью BULK COLLECT, с точки зрения скорости выполнения, этот способ наиболее оптимальный, но он не единственный, если скорость вас не интересует, то идеальным подходом может быть использование курсоров, вот так, например:

Обратите внимание на оператор DELETE, он важен, если вы будете обновлять таблицу несколько раз за сессию, то необходимо делать ее очистку, если этого требует логика, операция BULK COLLECT очищает таблицу автоматически и в этом случае DELETE выполнять не нужно.
Курсор удобен тем, что позволяет заполнить те поля, которые необходимы, не придерживаясь формата структуры записи таблицы.
Вот пример использования курсора при заполнении в Dynamic SQL:

Хочу обратить ваше внимание на ограничения в приведенном примере. Константа [tables] в приведенных кодах взята с потолка, т.е. это всего лишь значение индекса хэш-массива, что позволяет вам иметь таких таблиц сколько угодно с любыми названиями, лишь бы память сессии позволяла. Основным ограничением является структура полей записи временной таблицы, в примере имеется по 5 полей разных типов, если вам нужно больше, просто добавьте сколько считаете необходимым.

использование параметров на языке PL/SQL

Для передачи информации между модулем и вызывающим блоком PL/SQL используются параметры.

Параметры модуля, являющиеся частью его заголовка (или сигнатуры), являются не менее важными компонентами модуля, чем находящиеся в нем исполняемые команды. Заголовок программы иногда называется контрактом между автором и пользователями. Конечно, автор должен позаботиться о том, чтобы модуль выполнял свою задачу. Но ведь модули создаются именно для того, чтобы их можно было вызывать повторно — в идеале более чем из одного модуля. Если список параметров плохо составлен, то другим программистам будет сложно применять такой модуль. В таком случае уже будет неважно, насколько хорошо он написан.

Многие разработчики не уделяют должного внимания наборам параметров своих модулей. Следующие рекомендации помогут вам сделать правильный выбор:

  • Количество параметров. Если процедура или функция имеет слишком мало параметров, это снижает ее универсальность; с другой стороны, слишком большое количество параметров усложняет ее повторное использование. Конечно, количество параметров в основном определяется требованиями программы, но существуют разные варианты их определения (например, несколько параметров можно объединить в одну запись).
  • Типы параметров. При выборе типа необходимо учитывать, для каких целей будут использоваться параметры: только для чтения, только для записи, для чтения и записи.
  • Имена параметров. Параметрам следует присваивать простые имена, отражающие их назначение в модуле.
  • Значения по умолчанию. Когда параметру следует задать значение по умолчанию, а когда нужно заставить программиста ввести определенное значение?

PL/SQL предоставляет много средств эффективного планирования. В этом разделе представлены все элементы определения параметров.

Определение параметров

Формальные параметры определяются в списке параметров программы. Синтаксис определения параметров очень близок к синтаксису объявления переменных в разделе объявлений блока PL/SQL . Впрочем, существуют два важных различия : во-первых, для параметров определяется режим передачи, которого нет у объявлений переменных; во-вторых, объявление параметра должно быть неограниченным.

Ограниченное объявление устанавливает некоторые ограничения для значений, которые могут присваиваться переменной, объявленной с этим типом. Например, следующее объявление переменной company_name ограничивает переменную 60 символами:

При объявлении параметра ограничивающая часть опускается:

Формальные и фактические параметры

Очень важно понимать различия между формальными и фактическими параметрами. Формальные параметры представляют собой имена, объявленные в списке параметров заголовка модуля, тогда как фактические параметры — это значения и выражения, которые помещаются в список параметров при вызове модуля.

Различия между формальными и фактическими параметрами нам также поможет понять функция total_sales . Ее заголовок выглядит так:

Формальные параметры total_sales :

company_id_in — первичный ключ (идентификатор компании).

status_in — статус заказов, включаемых в вычисление.

Эти формальные параметры не существуют за пределами модуля. Их можно рассматривать как своего рода «заместителей» реальных значений, передаваемых модулю при его использовании в программе (то есть фактических параметров).

При вызове total_sales необходимо предоставить два аргумента, которыми могут быть переменные, константы или литералы (для параметров в режимах OUT и IN OUT это должны быть переменные). В следующем примере переменная company_id содержит первичный ключ, указывающий на запись компании. В первых трех вызовах total_sales функции передаются жестко запрограммированные значения статуса заказов, а в последнем вызове статус не указан; в этом случае функция присваивает параметру status_in значение по умолчанию, указанное в заголовке:

При вызове total_sales вычисляются значения всех фактических параметров. Результаты вычислений присваиваются соответствующим формальным параметрам внутри функции (обратите внимание: это относится только к параметрам IN и IN OUT; параметры режима OUT не копируются).

Формальные параметры и соответствующие им фактические параметры (указанные при вызове) должны относиться к одинаковым или совместимым типам данных. Во

многих ситуациях PL/SQL выполняет преобразования данных автоматически, однако лучше по возможности обходиться без неявных преобразований. Используйте такие функции, как TO_CHAR и TO_DATE , чтобы точно знать, какие данные получает модуль.

Режимы передачи параметров

При определении параметра также указывается допустимый способ его применения. Он задается с помощью одного из трех указанных в таблице режимов.

Режим Предназначение Использование параметров
IN Только для чтения Значение параметра может применяться, но не может быть изменено
в модуле. Если режим параметра не задан, используется режим IN
OUT Только для записи В модуле можно присвоить значение параметру, но нельзя использовать его. Впрочем, это «официальное» определение — на самом деле Oracle позволяет читать значение параметра OUT в подпрограмме
IN OUT Для чтения и записи В модуле можно использовать и изменять значение параметра

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

Процедура predict_activity принимает дату последнего действия ( last_date ) и описание этого действия ( task_desc_inout ). Возвращает она два значения: описание действия (возможно, модифицированное) и дату следующего действия (next_date_out). Поскольку параметр task_desk_inout передается в режиме IN OUT , программа может читать и изменять его значение.

Режим IN

Режим IN используется по умолчанию; если режим параметра не задан, параметр автоматически считается определенным в режиме IN. Тем не менее я рекомендую всегда указывать режим параметра, чтобы предполагаемое использование было явно указано в коде.

В заголовке программы параметрам IN могут присваиваться значения по умолчанию (см. раздел «Значения по умолчанию»).

Фактическим значением параметра IN может быть переменная, именованная константа, литерал или сложное выражение. Все следующие вызовы display_title допустимы:

А если вам потребуется передать данные из своей программы? В таком случае используйте параметр OUT или IN OUT — или рассмотрите возможность преобразования процедуры в функцию.

Режим OUT

Как вы, вероятно, уже поняли, параметр OUT по смыслу противоположен параметру IN. Параметры OUT могут использоваться для возвращения значений из программы вызывающему блоку PL/SQL. Параметр OUT сходен с возвращаемым значением функции, но он включается в список параметров, и количество таких параметров не ограничено (строго говоря, PL/SQL разрешает использовать до 64 000 параметров, но на практике это вряд ли можно считать ограничением).

В программе параметр OUT работает как неинициализированная переменная. Собственно, параметр OUT вообще не содержит никакого значения до успешного завершения вызванной программы (если только вы не использовали ключевое слово NOCOPY . Во время выполнения программы все операции присваивания параметру OUT в действительности выполняются с внутренней копией параметра. Когда программа успешно завершается и возвращает управление вызывающему блоку, значение локальной копии перемещается в параметр OUT. После этого значение становится доступным в вызывающем блоке PL/SQL.

У правил, относящихся к параметрам OUT , есть несколько практических следствий:

  • Параметрам OUT нельзя задавать значения по умолчанию. Значение параметра OUT может задаваться только в теле модуля.
  • Все операции присваивания параметрам OUT отменяются при инициировании исключения в программе. Так как значение параметра OUT присваивается только в случае успешного завершения программы, все промежуточные присваивания игнорируются. Если обработчик не перехватит исключение и не присвоит значение параметру OUT, параметр останется неизменным. Переменная сохранит значение, которое она имела до вызова программы.
  • Фактический параметр, соответствующий формальному параметру OUT, не может быть константой, литералом или выражением. Иначе говоря, он должен поддерживать присваивание.

Как упоминается выше в таблице, Oracle позволяет прочитать значение параметра OUT в подпрограмме. Это значение изначально всегда равно NULL , но после его присваивания в подпрограмме оно становится «видимым», как показывает следующий сценарий:

Режим IN OUT

В параметре IN OUT можно передавать значения программе и возвращать их на сторону вызова (либо исходное, неизменное значение, либо новое значение, заданное в программе). На параметры IN OUT распространяются два ограничения параметров OUT:

  • Параметр IN OUT не может быть константой, литералом или выражением.
  • Фактический параметр IN OUT должен быть переменной. Он не может быть константой, литералом или выражением, потому что эти форматы не могут использоваться PL/SQL в качестве приемника для размещения исходящих значений.

Других ограничений для параметров IN OUT нет.

Параметры IN OUT могут использоваться в обеих сторонах присваивания, потому что они работают как инициализированные переменные. PL/SQL не теряет значение параметра IN OUT в начале выполнения программы. Это значение может использоваться в программе там, где это необходимо.

Процедура combine_and_format_names объединяет имя и фамилию в заданном формате (« LAST, FIRST » или « FIRST LAST »). Процедура получает имя и фамилию, которые преобразуются к верхнему регистру. В ней продемонстрированы все три режима параметров:

Параметры имени и фамилии должны задаваться в режиме IN OUT . Параметр full_name_ out должен быть параметром OUT , потому что процедура возвращает результат объединения имени и фамилии. Наконец, параметр name_format_in, содержащий форматную строку, объявляется в режиме IN, потому что он описывает способ форматирования, но никак не изменяется в процедуре.

Каждый режим параметров имеет свои характеристики и предназначение. Тщательно выбирайте режим, назначаемый вашим параметрам, чтобы они правильно использовались в модулях.

Определяйте формальные параметры в режимах OUT и IN OUT только в процедурах. Функции должны возвращать всю свою информацию исключительно командой RETURN . Выполнение этой рекомендации упростит понимание и использование ваших подпрограмм. Кроме того, функции с параметрами OUT и IN OUT не могут вызываться из команд SQL .

Связывание формальных и фактических параметров в PL/SQL

Каким образом при выполнении программы определяется, какому формальному параметру должен соответствовать фактический параметр? PL/SQL предлагает два метода установления такого соответствия:

  • по позиции (неявное связывание);
  • по имени (явное связывание с указанием имени формального параметра и обозначения = >).

Позиционное связывание

Во всех приводившихся ранее примерах применялось связывание параметров в соответствии с их позицией. При использовании этого способа PL/SQL принимает во внимание относительные позиции параметров, то есть N-й фактический параметр в вызове программы связывается с N-м формальным параметром в заголовке программы. В следующем примере PL/SQL связывает первый фактический параметр : order. company_id с первым формальным параметром company_id_in , а второй фактический параметр 'N' — со вторым формальным параметром status_in :

Метод позиционного связывания параметров, безусловно, является более наглядным и понятным (рис. 3).

Позиционное связывание параметров

Рис. 3. Позиционное связывание параметров

связывание по имени

Чтобы установить соответствие параметров по имени, следует при вызове подпрограммы явно связать формальный параметр с фактическим. Для этого используется комбинация символов =>:

Поскольку имя формального параметра указано явно, PL/SQL уже не нужно учитывать порядок параметров. Поэтому в данном случае при вызове модуля не обязательно перечислять параметры в порядке их следования в заголовке. Функцию total_sales можно вызывать любым из двух способов:

В одном вызове можно комбинировать оба метода связывания фактических и формальных параметров:

При этом все «позиционные» параметры должны быть перечислены перед «именованными», как в приведенном примере. Позиционному методу необходима начальная точка для отсчета позиций, которой может быть только первый параметр. Если разместить «именованные» параметры перед «позиционными», PL/SQL собьется со счета. Оба вызова total_sales , приведенные ниже, недопустимы. В первой команде «именованные» параметры указываются до «позиционных», а во второй используется позиционная запись, но параметры перечислены в неверном порядке. В этом случае PL/SQL пытается преобразовать 'N' к типу NUMBER (для параметра company_id ):

Преимущества связывания по имени

Возникает резонный вопрос: зачем использовать связывание по имени? У него есть два основных преимущества:

  • Повышение информативности. При использовании связывания по имени вызов программы содержит сведения о формальных параметрах, с которыми ассоциируются фактические значения. Если вы не знаете, что делают модули, вызываемые приложением, наличие имен формальных параметров помогает понять назначение конкретного программного вызова. В некоторых средах разработки именно по этой причине связывание по имени считается стандартным. Эта причина особенно актуальна в том случае, когда имена формальных параметров строятся по схеме с присоединением суффикса режима. Только взглянув на вызов процедуры или функции, разработчик сразу видит, в каком направлении передаются те или иные данные.
  • Гибкость при описании параметров. Вы имеете возможность размещать параметры в удобном для работы порядке (конечно, это не значит, что при вызове аргументы можно перечислять так, как вам заблагорассудится!) и включать в список только те из них, которые действительно необходимы. В сложных приложениях иногда создаются процедуры с десятками параметров. Но как вы знаете, любой параметр, значение которого определяется по умолчанию, при вызове модуля может быть опущен. Разработчик может передать процедуре только те значения, которые необходимы для решения текущей задачи.

Давайте посмотрим, как реализовать все эти преимущества в программе. Возьмем для примера следующий заголовок:

Анализ списка параметров приводит нас к следующим выводам:

  • Минимальное количество аргументов, которые должны передаваться business_as_ usual , равно 3. Чтобы определить его, сложите количество параметров IN, не имеющих значения по умолчанию, с количеством параметров OUT и IN OUT.
  • При использовании связывания по позиции программа может вызываться с четырьмя или пятью аргументами, потому что последний параметр объявлен в режиме IN со значением по умолчанию.
  • Для хранения значений, возвращаемых параметрами OUT и IN OUT, понадобятся как минимум две переменные.

С таким списком параметров программа может вызываться несколькими способами:

  • Связывание только по позиции: задаются все фактические параметры. Обратите внимание, как трудно вспомнить, какой формальный параметр связывается с каждым из этих значений (и каков его смысл):
  • Связывание только по позиции: минимальное количество фактических параметров. Понять смысл вызова все еще нелегко:
  • Связывание только по имени с сохранением исходного порядка. Обратите внимание: смысл вызова business_as_usual вполне понятен и не требует пояснений:
  • Все параметры IN пропускаются, и для них используются значения по умолчанию (другая важная возможность связывания по имени):
  • Связывание по имени с изменением порядка следования фактических параметров и передачей неполного списка:
  • Объединение связывания по имени и по позиции. Список параметров начинается со связывания по позиции, а после перехода на связывание по имени вернуться к позиционному связыванию уже не удастся:

Как видите, механизм передачи аргументов в PL/SQL весьма гибок. Как правило, связывание по имени способствует написанию кода, который лучше читается и создает меньше проблем с сопровождением. От вас потребуется совсем немного: найти и записать имена параметров.

Квалификатор режима параметра NOCOPY

PL/SQL предоставляет возможность изменить определение параметра при помощи конструкции NOCOPY . NOCOPY требует, чтобы компилятор PL/SQL не создавал копии аргументов OUT и IN — и в большинстве случаев компилятор это требование удовлетворяет. NOCOPY используется прежде всего для повышения эффективности передачи больших конструкций (например, коллекций) в аргументах IN OUT .

Значения по умолчанию

Как было показано в предыдущих примерах, параметрам IN можно задать значения по умолчанию. Если параметр IN имеет значение по умолчанию, включать этот параметр в вызов программы не обязательно. Значение по умолчанию параметра вычисляется и используется программой только в том случае, если параметр не был включен в список при вызове. Конечно, для всех параметров IN OUT фактические параметры должны включаться в список. Значение по умолчанию определяется для параметра так же, как для объявляемой переменной. Предусмотрены два способа задания значений по умолчанию — с ключевым словом DEFAULT и с оператором присваивания ( := ):

Значения по умолчанию позволяют вызывать программы с разным количеством фактических параметров. Программа использует значения по умолчанию для всех незаданных параметров, а для параметров в списке значения по умолчанию заменяются указанными значениями. Несколько примеров разных вариантов использования связывания по позиции:

В первом вызове оба параметра задаются явно. Во втором вызове задается только первый фактический параметр, поэтому born_at_in присваивается текущая дата и время. В третьем вызове параметры вообще не указаны, поэтому круглые скобки отсутствуют (то же относится и к последнему вызову, в который включены пустые круглые скобки). Оба значения по умолчанию используются в теле процедуры.

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

Введение в представление v $ session в oracle (перевод)

В этом представлении каждый связан с база данных Экземпляр в сеансе У обоих есть запись. Включая пользователей session И фоновые процессы, такие как DBWR , LGWR , arcchiver и многое другое.

V$SESSION Общие столбцы в

V$SESSION Является ли базовое информационное представление, используемое для поиска пользователей SID или SADDR , Однако в нем также есть некоторые столбцы, которые динамически изменяются и могут использоваться для проверки пользователей. Например:

SQL_HASH_VALUE , SQL_ADDRESS : Эти два столбца используются для идентификации по умолчанию session реализованы SQL Утверждение. Если null или 0 Тогда объясни это session Ничего не сделал SQL Утверждение. PREV_HASH_VALUE с участием PREV_ADDRESS Два столбца используются для идентификации session Последнее выполненное заявление.

Примечание: при использовании SQL*Plus Делая выбор, убедитесь, что ширина столбца, которую вы переопределяете, не меньше 11 Для того, чтобы увидеть полное значение.

STATUS : Этот столбец используется для оценки session Статус:

l Achtive : Выполняется SQL утверждение (waiting for/using a resource)

l Inactive : В ожидании операции ( Это ждет, чтобы быть выполненным SQL утверждение )

l Killed : Помечено как удаленное

Следующие столбцы предоставляют session Информация может быть использована, когда один или несколько combination Найден, когда неизвестно session 。

Session Информация

l SID : SESSION Логотип, обычно используемый для подключения Другой колонка

l AUDSID : Обзор session ID Уникальность, подтвердите, что он также обычно используется при поиске режима параллельного запроса

l USERNAME :ток session в oracle Имя пользователя в.

Client Информация

база данных session Быть запущенным сервером базы данных или с промежуточного сервера или даже с рабочего стола SQL*Net Запускается клиентский процесс, подключенный к базе данных, а в следующих столбцах представлена ​​информация о клиенте.

l MACHINE : Машина, выполненная клиентом

l TERMINAL : Терминал работает на клиенте

l PROCESS : Клиентский процесс ID

l PROGRAM : Клиентская программа выполняется клиентом

Показывать подключенного пользователя PC из TERMINAL 、 OSUSER , Нужно PC из ORACLE.INI или Windows Установить ключевые слова в TERMINAL , USERNAME 。

Application Информация

перевод DBMS_APPLICATION_INFO Пакет, чтобы установить некоторую информацию, чтобы отличить пользователей. Это отобразит следующие столбцы.

l CLIENT_INFO : DBMS_APPLICATION_INFO Установить в

l ACTION : DBMS_APPLICATION_INFO Установить в

l MODULE : DBMS_APPLICATION_INFO Установить в

последующий V$SESSION Колонки также могут быть использованы:

V$SESSION Столбец подключения в ( Используется для связи с другими видами )

Column View Joined Column(s)

SID V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR SID

(SQL_HASH_VALUE, SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)

(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)

TADDR V$TRANSACTION ADDR

PADDR V$PROCESS ADDR

Примеры:

1. Найди свой session Информация

2. когда machine Найти когда известно session

3. Найти назначенный в данный момент session Бег sql Утверждение. предполагать sessionID для 100

Ищу быть назначенным session реализованы SQL Заявление является публичным требованием, если session Является главной причиной узкого места, которое можно рассматривать в соответствии с утверждением, которое оно выполняет в настоящее время session Что делаешь.

Волшебное использование V $ сессионного стола

Описание нескольких часто используемых полей в таблице v $ session

б) запрашивать различные статистические данные о пользователях

В. Запросите переменную курсора, которую пользователь хочет открыть.

г. Запрос информации о текущем ожидании пользователя. Чтобы понять, почему текущий оператор является настолько медленным / какие ресурсы ожидают.

д. Запрос информации о различных событиях, которые пользователь ждал в течение определенного периода времени. Чтобы понять узкое место, с которым столкнулся этот сеанс

2. поле ввода, адрес процесса, через это поле мы можем просмотреть соответствующую информацию о текущем процессе, идентификатор системного процесса, информацию о пользователе операционной системы и т. Д.

3. Поле команды указывает тип оператора, выполняемого в текущем сеансе. Пожалуйста, обратитесь к ссылке.

4. taddr Адрес текущей транзакции. Это поле можно использовать для просмотра информации о транзакции текущего сеанса, используемой информации сегмента отката и т. Д. ^ _ ^

5. В поле lockwait вы можете запросить соответствующую информацию о блокировке, ожидающей в данный момент через это поле.

6. (sql_address, sql_hash_value) (prev_sql_addr, prev_hash_value) В соответствии с этими двумя группами полей мы можем запросить подробную информацию об операторе SQL, выполняемом в текущем сеансе.

c) информация rowid заблокированного поля строится на основе вышеуказанных четырех полей.

8. logon_time Время входа в систему текущего сеанса.
9. last_call_et Время простоя сессии, обновляется каждые 3 секунды

Китайское введение каждой области:

SADDR - session address

AUDSID -Аудит идентификатор сессии. Вы можете запросить sid текущего сеанса через audsid. выберите sid из v $ session, где audsid = userenv ('sessionid');

USERNAME имя пользователя Равен имени пользователя в dba_users. Имя пользователя внутреннего процесса Oracle пусто.

COMMAND - Идентификатор sql, выполняемый сессией, где 1 представляет создание таблицы, а 3 - выбор.

TADDR Текущий адрес транзакции. Может использоваться для связи поля addr в v $ транзакции.

LOCKWAIT -Вы можете запросить соответствующую информацию о блокировке в настоящее время ожидает через это поле. sid + lockwait соответствует sid + kaddr в v $ loc.

STATUS -Используется для оценки статуса сессии. Активно: оператор SQL выполняется. неактивно: ожидание операции. убитый: помечен как убитый.

SERVER - Тип Обслуживания.

SCHEMANAME -схема логин. Внутренний процесс Oracle - это sys.

OSUSER Имя пользователя операционной системы клиента.

PROCESS Идентификатор процесса клиента.

MACHINE Имя клиента.

TERMINAL Имя терминала, выполненное клиентом.

PROGRAM -Клиентское приложение. Такие как ORACLE.EXE или sqlplus.exe

TYPE тип сессии

SQL_ADDRESS , SQL_HASH_VALUE, SQL_ID, SQL_CHILD_NUMBER - состояние sql выполняемой сессии, соответствующее адресу, hash_value, sql_id, child_number в v $ sql. PREV_SQL_ADDR,PREV_HASH_VALUE,PREV_SQL_ID,PREV_CHILD_NUMBER -Состояние последнего выполненного SQL.

MODULE,MODULE_HASH,ACTION,ACTION_HASH,CLIENT_INFO -Апп прошел

DBMS_APPLICATION_INFO Установите некоторую информацию.

FIXED_TABLE_SEQUENCE Значение, которое будет увеличиваться, когда сеанс завершит пользовательский вызов, то есть, если сеанс будет приостановлен, он не будет увеличиваться. Следовательно, производительность сеанса с определенного момента времени можно отслеживать на основе этого поля. Например, значение этого поля для сеанса один час назад было 10000, но теперь оно составляет 20 000, что указывает на то, что его пользовательские вызовы происходят чаще в течение часа, и вы можете сосредоточиться на статистике производительности этого сеанса.

Читайте также: