- This topic has 3 replies, 2 voices, and was last updated 6 years, 6 months ago by José Laurindo Chiappa.
-
AuthorPosts
-
15 de maio de 2018 at 11:52 pm #109285airoospParticipant
Boa tarde,
Fazendo uns testes para verificar os comandos DML que estão em execução no banco conforme a sessão, vi que algumas vezes a coluna SQL_ID que aparece na v$session não vem preenchida.
Quando existe valor nesta coluna, é possível obter o SQL usando as v$sql, v$sqltext, v$sqlarea.Mas como fazer quando sql_id esta vazio?
Alguém tem alguma dica?
Banco 11g R2 STD One em Windows.
Obrigado.
Airton
16 de maio de 2018 at 5:46 am #109286José Laurindo ChiappaModeratorXô entender : vc tem um sessão Ativa, que está SIM executando algo, mas o SQL_ID está vazio ??? SE é isso, com 99,99% de certeza a sua sessão Não Deve estar executando um SQL digitado e enviado diretamente, mas sim deve estar executando um SQL encapsulado dentro de um PL/SQL, é um dos POUCOS casos onde vc pode observar isso, vide https://community.oracle.com/thread/2246920?start=0&tstart=0 pra refs….
SE FOR ISSO, primeiro : pra vc consultar os PL/SQLs que estão em execução vc pode usar um script como este (conectado como um usuário privilegiado que pode ler as X$) :prompt **** Currently Executing PL/SQL ****
SELECT /*+ RULE */
substr(DECODE(o.kglobtyp,
7, ‘PROCEDURE’, 8, ‘FUNCTION’, 9, ‘PACKAGE’, 12, ‘TRIGGER’, 13,
‘CLASS’),1,15) “TYPE”,
substr(o.kglnaown,1,30) “OWNER”,
substr(o.kglnaobj,1,30) “NAME”,
s.indx “SID”,
s.ksuseser “SERIAL”
FROM
sys.X$KGLOB o,
sys.X$KGLPN p,
sys.X$KSUSE s
WHERE
o.inst_id = USERENV(‘Instance’) AND
p.inst_id = USERENV(‘Instance’) AND
s.inst_id = USERENV(‘Instance’) AND
o.kglhdpmd = 2 AND
o.kglobtyp IN (7, 8, 9, 12, 13) AND
p.kglpnhdl = o.kglhdadr AND
s.addr = p.kglpnses
ORDER BY 4, 2, 1
/==> Uma vez confirmado que a coluna SQL_ID está vazia porque a sessão está na verdade rodando um PL/SQL, provavelmente vc deverá ser capaz de obter o texto desse SQL sendo executado dentro de um PL/SQL consultando diretamente o cache de SQLs tipo :
select x.sid
,x.serial#
,x.username
,x.sql_id
,x.sql_child_number
,optimizer_mode
,hash_value
,address
,sql_text
from v$sqlarea sqlarea
,v$session x
where x.sql_hash_value = sqlarea.hash_value
and x.sql_address = sqlarea.address
and x.username is not null;Normalmente o SQL_ADDRESS da V$SESSION pode ser joineado com as V$ de SQL….
[]s
Chiappa
OBS : nem preciso dizer, se teu Objetivo é monitorar/acompanhar a progressão de um PL/SQL, o Correto é OU vc instrumentar teu código PL/SQL (por exemplo colocando msgs na coluna CLIENT_INFO e similares da V$SESSION via DBMS_APPLICATION_INFO, ou criando LOGs via UTL_FILE) OU então vc compilar em DEBUG mode teu PL/SQL e o executar num debugador….
16 de maio de 2018 at 6:04 pm #109288airoospParticipantBom dia Chiappa,
Agradeço as informações, usando o 2º select que você passou conseguiu obter as informações usando como teste o código abaixo:
begin
DBMS_APPLICATION_INFO.SET_CLIENT_INFO (CLIENT_INFO => ‘TESTE2’);
DBMS_APPLICATION_INFO.SET_ACTION(‘INSERT’);insert into teste123(object_name) select object_name from teste123;
end;
A consulta mostra as informações definidas acima no dbms e também o sql_id.
Mas ao executar um outro o código “select sysdate from dual;” (esta em um arquivo .SQL com 954 repetidas), a consulta que você passou não retorna nada e como estou usando o PL/SQL Developer, verifiquei na janela sessions que a linha em execução não tem o sql_id.
O sql_id aparece somente na execução do insert, update e delete?
Obrigado.
Airton
16 de maio de 2018 at 8:27 pm #109289José Laurindo ChiappaModeratorEntão : não sei de onde esse tal do PL/SQL Developer tira a sua informação, E não sei se ele fecha e/ou remove do cache os cursores SQL após uma execução… O que eu posso Afirmar é que no RDBMS Oracle o SQL_ID é registrado SIM para todos os SQLs (tanto queries quanto DMLs), E na v$session enquanto a sessão permanecer conectada E o cache de SQLs não for esvaziado, a coluna SQL_ID fica preencida, E no próximo SQL que entrar, esse ID do SQL anterior vai pra coluna PREV_SQL_ID e o ID do novo SQL VAI pro SQL_ID…. EXEMPLO, usando uma conexão DEDICADA numa ferramenta que eu SEI que não fecha cursores após a execução de um SQL (o sqlplus no caso) :
SYSTEM:@O11GR2SE:SQL>select ‘Teste 1’ from dual;
‘TESTE1
——-
Teste 1SYSTEM:@O11GR2SE:SQL>
==> consulto a V$SESSION pra essa sessão :
SYS:AS SYSDBA@O11GR2SE:SQL>select v.username, v.sid, v.serial#, v.program, v.sql_id,
2 s.sql_fulltext from v$session v, v$sqlarea s
3* where v.sql_id = s.sql_id and v.username=’SYSTEM’;USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT
——————————————————————————–
SYSTEM 10 9 sqlplus.exe 32hj2fxpsk059
select ‘Teste 1’ from dualSYS:AS SYSDBA@O11GR2SE:SQL>
==> agora vou executar um outro SQL naquela mesma sessão :
SYSTEM:@O11GR2SE:SQL>select ‘Teste 2’ from dual;
‘TESTE2
——-
Teste 2SYSTEM:@O11GR2SE:SQL>
==> repetindo a consulta :
SYS:AS SYSDBA@O11GR2SE:SQL>/
USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT
——————————————————————————–
SYSTEM 10 9 sqlplus.exe 934p80x0crgd0
select ‘Teste 2′ from dualSYS:AS SYSDBA@O11GR2SE:SQL>
==> E outro ponto IMPORTANTE pro seu caso : quando o mesmo SQL é executado múltiplas vezes na mesma sessão por uma tool que NÂO fecha cursores a cada execução nem nada assim, o mesmo SQL_ID é mantido no cache, só a coluna EXECUTIONS é incrementada) – veja como está neste momento :
SYS:AS SYSDBA@O11GR2SE:SQL>ed
Gravou file afiedt.buf1 select v.username, v.sid, v.serial#, v.program, v.sql_id,
2 s.sql_fulltext, s.executions from v$session v, v$sqlarea s
3* where v.sql_id = s.sql_id and v.username=’SYSTEM’
SYS:AS SYSDBA@O11GR2SE:SQL>/USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT EXECUTIONS
——————————————————————————– ———-
SYSTEM 10 9 sqlplus.exe 934p80x0crgd0
select ‘Teste 2’ from dual 1SYS:AS SYSDBA@O11GR2SE:SQL>
==> Executo o mesmo SQL repetidamente, na mesma sessão :
SYSTEM:@O11GR2SE:SQL>select ‘Teste 2’ from dual;
‘TESTE2
——-
Teste 2SYSTEM:@O11GR2SE:SQL>/
‘TESTE2
——-
Teste 2SYSTEM:@O11GR2SE:SQL>/
‘TESTE2
——-
Teste 2SYSTEM:@O11GR2SE:SQL>/
‘TESTE2
——-
Teste 2SYSTEM:@O11GR2SE:SQL>/
‘TESTE2
——-
Teste 2SYSTEM:@O11GR2SE:SQL>
==> Ó como ficou :
SYS:AS SYSDBA@O11GR2SE:SQL> select v.username, v.sid, v.serial#, v.program, v.sql_id,
2 s.sql_fulltext, s.executions from v$session v, v$sqlarea s
3* where v.sql_id = s.sql_id and v.username=’SYSTEM’;USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT EXECUTIONS
——————————————————————————– ———-
SYSTEM 10 9 sqlplus.exe 934p80x0crgd0
select ‘Teste 2′ from dual 5SYS:AS SYSDBA@O11GR2SE:SQL>
======>>>>>> OU SEJA, O TEU CASO DE TER UM ARQUIVO .SQL COM O MESMO EXATO TEXTO (select sysdate from dual) repetido centenas de vezes ** TEM SIM ** que ser matindo no CACHE, só aumentando as execuções…. Meu contra-exemplo é um arquivo .SQL com o mesmo texto :
C:Usersjlchi_000>notepad script_select_sysdate.sql
C:Usersjlchi_000>type C:Usersjlchi_000script_select_sysdate.sql | more
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE FROM DUAL;
SELECT SYSDATE FROM DUAL;
…….==> repetido milhares de vezes… Vou executar na mesma sessão do SYSTEM :
SYSTEM:@O11GR2SE:SQL>@C:Usersjlchi_000script_select_sysdate.sql
==>> e enqunto executa vou consultando SQL_ID e Executions :
SYS:AS SYSDBA@O11GR2SE:SQL>l
1 select v.username, v.sid, v.serial#, v.program, v.sql_id,
2 s.sql_fulltext, s.executions from v$session v, v$sqlarea s
3* where v.sql_id = s.sql_id and v.username=’SYSTEM’
SYS:AS SYSDBA@O11GR2SE:SQL>/USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT EXECUTIONS
——————————————————————————– ———-
SYSTEM 10 9 sqlplus.exe c749bc43qqfz3
SELECT SYSDATE FROM DUAL 2742SYS:AS SYSDBA@O11GR2SE:SQL>/
USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT EXECUTIONS
——————————————————————————– ———-
SYSTEM 10 9 sqlplus.exe c749bc43qqfz3
SELECT SYSDATE FROM DUAL 5402SYS:AS SYSDBA@O11GR2SE:SQL>/
USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT EXECUTIONS
——————————————————————————– ———-
SYSTEM 10 9 sqlplus.exe c749bc43qqfz3
SELECT SYSDATE FROM DUAL 7238SYS:AS SYSDBA@O11GR2SE:SQL>
==> e depois que acabou a execução do arquivo .SQL :
SYSDATE
——–
16/05/18SYSTEM:@O11GR2SE:SQL>
==> O resultado é :
SYS:AS SYSDBA@O11GR2SE:SQL>/
USERNAME SID SERIAL# PROGRAM SQL_ID
—————- —— ——– —————————————————————- ————-
SQL_FULLTEXT EXECUTIONS
——————————————————————————– ———-
SYSTEM 10 9 sqlplus.exe c749bc43qqfz3
SELECT SYSDATE FROM DUAL 75547SYS:AS SYSDBA@O11GR2SE:SQL>
===>> REPITA meu exemplo no sqlplus E no PL/SQL Developer, se vc NÂO VER o mesmo é por sua conta ver se o culpado é o PL/SQL Developer fechando cursores após cada execução, e se sim ver se há alguma config pra isso….
[]s
Chiappa
-
AuthorPosts
- You must be logged in to reply to this topic.