tracing oracle sql statements

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

tracing oracle sql statements

Сообщение Gaziz »

Hia!

Here is difficult oracle question. The environment is pretty simple: unknown application with oci oracle client and oracle 9i server.
I need to see in clear text *exact* *all* SQL command that apps sends to DB and all responces (as much as possible in clear text).

What is the simpliest solution?

Gaziz
(Alex)
Маньяк
Сообщения: 4203
Зарегистрирован: 08 мар 2006, 15:45
Откуда: Ричмонд

Re: tracing oracle sql statements

Сообщение (Alex) »

Gaziz писал(а):Hia!

Here is difficult oracle question. The environment is pretty simple: unknown application with oci oracle client and oracle 9i server.
I need to see in clear text *exact* *all* SQL command that apps sends to DB and all responces (as much as possible in clear text).

What is the simpliest solution?

Gaziz
если без наворотов то можно сделать с tkprof. Эта утилита которая с ораклом поставляется.
тут все ключевые слова есть:
http://www.psoug.org/reference/trace_tkprof.html
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

Re: tracing oracle sql statements

Сообщение Gaziz »

(Alex) писал(а):
Gaziz писал(а):Hia!

Here is difficult oracle question. The environment is pretty simple: unknown application with oci oracle client and oracle 9i server.
I need to see in clear text *exact* *all* SQL command that apps sends to DB and all responces (as much as possible in clear text).

What is the simpliest solution?

Gaziz
если без наворотов то можно сделать с tkprof. Эта утилита которая с ораклом поставляется.
тут все ключевые слова есть:
http://www.psoug.org/reference/trace_tkprof.html
damn! I have oracle 9i :(
(Alex)
Маньяк
Сообщения: 4203
Зарегистрирован: 08 мар 2006, 15:45
Откуда: Ричмонд

Re: tracing oracle sql statements

Сообщение (Alex) »

Gaziz писал(а):
(Alex) писал(а):
Gaziz писал(а):Hia!

Here is difficult oracle question. The environment is pretty simple: unknown application with oci oracle client and oracle 9i server.
I need to see in clear text *exact* *all* SQL command that apps sends to DB and all responces (as much as possible in clear text).

What is the simpliest solution?

Gaziz
если без наворотов то можно сделать с tkprof. Эта утилита которая с ораклом поставляется.
тут все ключевые слова есть:
http://www.psoug.org/reference/trace_tkprof.html
damn! I have oracle 9i :(
а эта утилита есть в 9i, 8, 8i, 7.3 :-) etc.
bormo
Пользователь
Сообщения: 194
Зарегистрирован: 19 май 2006, 21:03
Откуда: + 1 604

Сообщение bormo »

С 6 по 10 :) Раньше может тоже была, не знаю.
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

Сообщение Gaziz »

bormo писал(а):С 6 по 10 :) Раньше может тоже была, не знаю.
Thanks, there is some progress with this. Ideally I want to see the real values of variables b1 and b2. I tries level 4 and 12 but nothing helps :(

=====================
PARSING IN CURSOR #22 len=144 dep=1 uid=61 oct=3 lid=61 tim=2618144194233 hv=2112349310 ad='22e97acc'
SELECT GROUP_ID
FROM HOME_ASSOCIATION
WHERE APC_NEIGHBOURHOOD_ID = :b2
AND APC_GROUP_ID != :b1
END OF STMT
PARSE #22:c=0,e=98,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=2618144194219
EXEC #22:c=0,e=74,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=2618144194759
FETCH #22:c=0,e=53,p=0,cr=1,cu=0,mis=0,r=1,dep=1,og=4,tim=2618144194971
bormo
Пользователь
Сообщения: 194
Зарегистрирован: 19 май 2006, 21:03
Откуда: + 1 604

Сообщение bormo »

Какое-то время нереальное, сколько записей в таблице? Какой сервер (кол-во процессоров), какая система и версия оракула?

Желательно еще структуру таблицы со всеми индексами.
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

Сообщение Gaziz »

bormo писал(а):Какое-то время нереальное, сколько записей в таблице? Какой сервер (кол-во процессоров), какая система и версия оракула?

Желательно еще структуру таблицы со всеми индексами.
small tables on solaris10 ultra10, oracle 9i.
bormo
Пользователь
Сообщения: 194
Зарегистрирован: 19 май 2006, 21:03
Откуда: + 1 604

Сообщение bormo »

Гляди, по существу вопроса, т.е. как получить полный запрос, без параметров получить если обращение идет через oci вряд ли получится. У него логика такая - он делает prepare с параметрами, потом подстановку и execute а после fetch, в принципе и все остальные коннекты так работают, более или менее. Типа запрос кешется при prepare и следующий раз выполняется быстрее. Но шанс есть. Если запрос бежит долго - а судя по трейсу это так и есть, то можно выцепить текущий sql прямо из сессии.

надо наваять запрос по

v$session
v$process
V$sql


set wra off
set lin 120
select
u.sid,
u.username,
s.sql_text
from
v$sql s,
v$session u
where
s.hash_value = u.sql_hash_value
and
sql_text not like '%from v$sql s, v$session u%'
order by
u.sid;


А параметры достать из v$sql_bind_capture так:

select u.sid,
u.username,
u.sql_id,
u.sql_child_number,
s.name,
s.value_string
from v$sql_bind_capture s, v$session u
where u.sql_hash_value = s.hash_value
and u.sql_address = s.address
and u.username is not null;


Что же касается перформанса на солярке - вопрос непростой. Честно говоря по сравнению скажем с HPUX и AIX у меня на солярке опыт более негативный. Сейчас я клепаю очередной и уже не первый баг с экспортом/импортом, чтобы послать в оракул. Ну да ладно, проверь следующие вещи:

1. Параметры

select value from v$parameter where name='optimizer_index_cost_adj';

обычно колеблется от 100 к 1, попробуй 25 и 1. 100 не ставь.

2. SGA

если аппликашка oci то 80-90% памяти надо отдать db_block_buffers и забрать из разных shared pool, large pool, java pool. В shared оставить по 5-10 мег на схему.

3. Диск.

проверить как быстро работает диск, на котором расположены датафайлы с этой таблицей и system tablespace

4. План запроса.

когда получишь сиквел и параметры - открой sqlplus

set timing on
set autotrace traceonly

и запусти запросик. Пришли план. Если запросит plan_table - найди ее в system и сделай

grant select,insert,delete,update on plan_table to public;
create public synonym plan_table for system.plan_table;

или построй прямо в юзере,скрипт валяется где-то в оракуле.

И еще тип относительно солярки - если в таблице есть blob,clob, итд - сделай:

alter table <table_name> modify lob (<lobcolumn>) (cache);

Это же кстати решает проблему со скоростью импорта в солярке с оракулом.

И для больших таблиц смело используй явный паралелизм.
Аватара пользователя
Gaziz
Житель
Сообщения: 944
Зарегистрирован: 17 фев 2003, 15:57
Откуда: Almaty-Toronto-Vancouver-Seattle

Сообщение Gaziz »

bormo писал(а):Гляди, по существу вопроса, т.е. как получить полный запрос, без параметров получить если обращение идет через oci вряд ли получится. У него логика такая - он делает prepare с параметрами, потом подстановку и execute а после fetch, в принципе и все остальные коннекты так работают, более или менее. Типа запрос кешется при prepare и следующий раз выполняется быстрее. Но шанс есть. Если запрос бежит долго - а судя по трейсу это так и есть, то можно выцепить текущий sql прямо из сессии.

надо наваять запрос по

v$session
v$process
V$sql


set wra off
set lin 120
select
u.sid,
u.username,
s.sql_text
from
v$sql s,
v$session u
where
s.hash_value = u.sql_hash_value
and
sql_text not like '%from v$sql s, v$session u%'
order by
u.sid;


А параметры достать из v$sql_bind_capture так:

select u.sid,
u.username,
u.sql_id,
u.sql_child_number,
s.name,
s.value_string
from v$sql_bind_capture s, v$session u
where u.sql_hash_value = s.hash_value
and u.sql_address = s.address
and u.username is not null;


Что же касается перформанса на солярке - вопрос непростой. Честно говоря по сравнению скажем с HPUX и AIX у меня на солярке опыт более негативный. Сейчас я клепаю очередной и уже не первый баг с экспортом/импортом, чтобы послать в оракул. Ну да ладно, проверь следующие вещи:

1. Параметры

select value from v$parameter where name='optimizer_index_cost_adj';

обычно колеблется от 100 к 1, попробуй 25 и 1. 100 не ставь.

2. SGA

если аппликашка oci то 80-90% памяти надо отдать db_block_buffers и забрать из разных shared pool, large pool, java pool. В shared оставить по 5-10 мег на схему.

3. Диск.

проверить как быстро работает диск, на котором расположены датафайлы с этой таблицей и system tablespace

4. План запроса.

когда получишь сиквел и параметры - открой sqlplus

set timing on
set autotrace traceonly

и запусти запросик. Пришли план. Если запросит plan_table - найди ее в system и сделай

grant select,insert,delete,update on plan_table to public;
create public synonym plan_table for system.plan_table;

или построй прямо в юзере,скрипт валяется где-то в оракуле.

И еще тип относительно солярки - если в таблице есть blob,clob, итд - сделай:

alter table <table_name> modify lob (<lobcolumn>) (cache);

Это же кстати решает проблему со скоростью импорта в солярке с оракулом.

И для больших таблиц смело используй явный паралелизм.
Спасибо за детальный ответ!

Когда запускаю
select u.sid,
u.username,
u.sql_id,
u.sql_child_number,
s.name,
s.value_string
from v$sql_bind_capture s, v$session u
where u.sql_hash_value = s.hash_value
and u.sql_address = s.address
and u.username is not null;


что то ей не хватает :(

5:52:39 PM Start SQL Editor Execution ...
5:52:39 PM Processing ...
5:52:39 PM from v$sql_bind_capture s, v$session u
5:52:39 PM *
5:52:39 PM ORA-00942: table or view does not exist
5:52:39 PM *** Script stopped due to error ***
5:52:39 PM *** SCRIPT END : Session:RELAY@grelay3(1) 11/09/2006 5:52:39 PM ***
5:52:39 PM End SQL Editor Execution
Bege-Motek
Пользователь
Сообщения: 93
Зарегистрирован: 14 июл 2006, 16:15

Сообщение Bege-Motek »

Есть у юзера под которым ты заходишь grant select any dictionary?
bormo
Пользователь
Сообщения: 194
Зарегистрирован: 19 май 2006, 21:03
Откуда: + 1 604

Сообщение bormo »

Да, скорее всего правов не хватает, попроси вышеуказанный грант у админа.
Ответить