Как увидеть фактический оператор SQL SQL, который выполняется - PullRequest
26 голосов
/ 11 сентября 2008

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

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

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

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

Ответы [ 6 ]

24 голосов
/ 11 сентября 2008

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

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

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

and TABLETYPE=’:b16’

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

and TABLETYPE=’MT’

Примером этих таблиц в действии является следующий SQL-запрос для поиска 20 лучших дисковедов. Вы можете изменить это, удалив WHERE rownum <= 20 </strong> и, возможно, добавить модуль ORDER BY . Вы часто обнаруживаете, что модуль даст вам подсказку о том, какое программное обеспечение выполняет запрос (например: «TOAD 9.0.1.8», «Тонкий клиент JDBC», «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
;
8 голосов
/ 11 сентября 2008

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

Если вы хотите произвести впечатление на своих друзей из Oracle DBA, узнайте, как установить трассировку оракула с событием 10046, интерпретируйте значение событий ожидания и найдите лучших потребителей процессора.

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

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

3 голосов
/ 11 сентября 2008

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

2 голосов
/ 11 сентября 2008

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

[Редактировать] Черт, два других ответа уже. Должен печатать быстрее в следующий раз; -)

1 голос
/ 16 сентября 2008

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

С
sess AS
(
ВЫБРАТЬ *
ОТ V $ СЕССИИ
ГДЕ ИМЯ ПОЛЬЗОВАТЕЛЯ = ПОЛЬЗОВАТЕЛЬ
ЗАКАЗАТЬ НА СТОРОНУ
)
ВЫБЕРИ si.SID,
si.LOCKWAIT
si.OSUSER
si.PROGRAM
si.LOGON_TIME
si.STATUS
(
ВЫБЕРИТЕ КРУГЛЫЙ (USED_UBLK * 8 / 1024,1)
ОТ V $ СДЕЛКИ,
Sess
ГДЕ 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
ГДЕ АДРЕС = SI.SQL_ADDRESS И
ЧАСТЬ <30 <BR> ) SQL_TEXT
ОТ sess si;
0 голосов
/ 16 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...