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


Я думаю, что таблица V $ SQLAREA содержит то, что вы ищете (см. Столбцы SQL_TEXT и SQL_FULLTEXT).
На стороне словаря данных есть много инструментов, которые вы можете использовать, например Схема шпион
Чтобы узнать, какие запросы выполняются, посмотрите представления 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;
Просто к сведению, будьте осторожны с запросами к этой таблице в загруженной производственной системе. Это совокупность v $ sql, поэтому запрос может оказаться очень дорогостоящим.