Как увидеть фактический выполняемый оператор Oracle SQL

Я использую специально разработанное приложение, которое еженедельно генерирует стандартный набор отчетов. У меня нет доступа к исходному коду приложения, и все говорят мне, что для схемы базы данных Oracle нет документации. (Ааааааааааааааааааааааа)

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

Насколько я понимаю, журналы мне не помогут, потому что отчет запрашивает только базу данных; он фактически не вставляет, не удаляет и не обновляет значения базы данных, поэтому регистрировать нечего (это правильно?).

Итак, мой вопрос таков: есть ли инструмент или утилита (Oracle или что-то еще), которые я могу использовать, чтобы увидеть фактический оператор SQL, который выполняется, пока задание генерации отчета все еще выполняется? Я полагаю, если я смогу увидеть, к каким таблицам на самом деле осуществляется доступ для создания существующего отчета, у меня будет очень хорошая отправная точка для изучения схемы и определения правильного SQL для использования в моем собственном отчете.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
27
0
109 420
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я думаю, что таблица V $ SQLAREA содержит то, что вы ищете (см. Столбцы SQL_TEXT и SQL_FULLTEXT).

Просто к сведению, будьте осторожны с запросами к этой таблице в загруженной производственной системе. Это совокупность v $ sql, поэтому запрос может оказаться очень дорогостоящим.

Ethan Post 11.09.2008 11:01
Ответ принят как подходящий

На стороне словаря данных есть много инструментов, которые вы можете использовать, например Схема шпион

Чтобы узнать, какие запросы выполняются, посмотрите представления sys.v_ $ sql и sys.v_ $ sqltext. Вам также понадобится доступ к sys.all_users

Следует отметить, что запросы, использующие параметры, будут отображаться один раз с такими записями, как

and TABLETYPE=’:b16’

в то время как другие, которые этого не делают, будут появляться несколько раз, например:

and TABLETYPE=’MT’

Примером этих таблиц в действии является следующий SQL-запрос для поиска 20 наиболее часто встречающихся ошибок чтения на диске. Вы можете изменить это, удалив ГДЕ rownum <= 20 и, возможно, добавив ЗАКАЗАТЬ модуль. Вы часто обнаруживаете, что модуль подскажет, какое программное обеспечение выполняет запрос (например: «TOAD 9.0.1.8», «JDBC Thin Client», «runcbl @ somebox (TNS V1-V3)» и т. д.)

SELECT 
 module, 
 sql_text, 
 username, 
 disk_reads_per_exec, 
 buffer_gets, 
 disk_reads, 
 parse_calls, 
 sorts, 
 executions, 
 rows_processed, 
 hit_ratio, 
 first_load_time, 
 sharable_mem, 
 persistent_mem, 
 runtime_mem, 
 cpu_time, 
 elapsed_time, 
 address, 
 hash_value 
FROM 
  (SELECT
   module, 
   sql_text , 
   u.username , 
   round((s.disk_reads/decode(s.executions,0,1, s.executions)),2)  disk_reads_per_exec, 
   s.disk_reads , 
   s.buffer_gets , 
   s.parse_calls , 
   s.sorts , 
   s.executions , 
   s.rows_processed , 
   100 - round(100 *  s.disk_reads/greatest(s.buffer_gets,1),2) hit_ratio, 
   s.first_load_time , 
   sharable_mem , 
   persistent_mem , 
   runtime_mem, 
   cpu_time, 
   elapsed_time, 
   address, 
   hash_value 
  FROM
   sys.v_$sql s, 
   sys.all_users u 
  WHERE
   s.parsing_user_id=u.user_id 
   and UPPER(u.username) not in ('SYS','SYSTEM') 
  ORDER BY
   4 desc) 
WHERE
 rownum <= 20;

Обратите внимание, что если запрос длинный ... вам нужно будет запросить v_ $ sqltext. Это хранит весь запрос. Вам нужно будет найти АДРЕС и HASH_VALUE и собрать все части. Например:

SELECT
 *
FROM
 sys.v_$sqltext
WHERE
 address = 'C0000000372B3C28'
 and hash_value = '1272580459'
ORDER BY 
 address, hash_value, command_type, piece
;

Да, это определенно возможно. Представления v $ sql содержат эту информацию. Что-то вроде этот фрагмент кода должно указать вам правильное направление. Я сам не пробовал этот конкретный фрагмент кода - сейчас и рядом с Oracle DB.

[Edit] Проклятье уже два других ответа. В следующий раз нужно будет печатать быстрее ;-)

Извините за короткий ответ, но уже поздно. Google "oracle event 10046 sql trace". Лучше всего отслеживать отдельный сеанс, потому что определить, какой SQL какой сеанс принадлежит из v $ sql, непросто, если он является общим sql и используется несколькими пользователями.

Если вы хотите произвести впечатление на своих друзей-администраторов баз данных Oracle, узнайте, как установить трассировку Oracle с помощью события 10046, интерпретировать значение событий ожидания и найти основных потребителей ЦП.

У Quest был бесплатный продукт, который позволял вам захватывать SQL по мере его выхода со стороны клиента, но не был уверен, работает ли он с вашим продуктом / версией Oracle. Гугл "quest oracle sql monitor" для этого.

Спокойной ночи.

У меня была (есть) аналогичная проблема в приложении Java. Я написал оболочку драйвера JDBC вокруг драйвера Oracle, поэтому весь вывод отправляется в файл журнала.

- Я использую что-то вроде этого, с концепциями и некоторым кодом, украденным с asktom.
- предложения по доработке приветствуются

WITH
sess AS
(
SELECT *
FROM V$SESSION
WHERE USERNAME = USER
ORDER BY SID
)
SELECT si.SID,
si.LOCKWAIT,
si.OSUSER,
si.PROGRAM,
si.LOGON_TIME,
si.STATUS,
(
SELECT ROUND(USED_UBLK*8/1024,1)
FROM V$TRANSACTION,
sess
WHERE sess.TADDR = V$TRANSACTION.ADDR
AND sess.SID = si.SID

) rollback_remaining,

(
SELECT (MAX(DECODE(PIECE, 0,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 1,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 2,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 3,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 4,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 5,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 6,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 7,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 8,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 9,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 10,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 11,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 12,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 13,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 14,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 15,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 16,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 17,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 18,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 19,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 20,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 21,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 22,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 23,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 24,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 25,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 26,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 27,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 28,SQL_TEXT,NULL)) ||
MAX(DECODE(PIECE, 29,SQL_TEXT,NULL)))
FROM V$SQLTEXT_WITH_NEWLINES
WHERE ADDRESS = SI.SQL_ADDRESS AND
PIECE < 30
) SQL_TEXT
FROM sess si;

Другие вопросы по теме