Pular para o conteúdo
  • Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 4 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #109285
    Avatar de airoospairoosp
    Participante

      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

      #109286
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Xô 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….

        #109288
        Avatar de airoospairoosp
        Participante

          Bom 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

          #109289
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Entã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 1

            SYSTEM:@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 dual

            SYS:AS SYSDBA@O11GR2SE:SQL>

            ==> agora vou executar um outro SQL naquela mesma sessão :

            SYSTEM:@O11GR2SE:SQL>select ‘Teste 2’ from dual;

            ‘TESTE2
            ——-
            Teste 2

            SYSTEM:@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 dual

            SYS: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.buf

            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 934p80x0crgd0
            select ‘Teste 2’ from dual 1

            SYS:AS SYSDBA@O11GR2SE:SQL>

            ==> Executo o mesmo SQL repetidamente, na mesma sessão :

            SYSTEM:@O11GR2SE:SQL>select ‘Teste 2’ from dual;

            ‘TESTE2
            ——-
            Teste 2

            SYSTEM:@O11GR2SE:SQL>/

            ‘TESTE2
            ——-
            Teste 2

            SYSTEM:@O11GR2SE:SQL>/

            ‘TESTE2
            ——-
            Teste 2

            SYSTEM:@O11GR2SE:SQL>/

            ‘TESTE2
            ——-
            Teste 2

            SYSTEM:@O11GR2SE:SQL>/

            ‘TESTE2
            ——-
            Teste 2

            SYSTEM:@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 5

            SYS: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 2742

            SYS:AS SYSDBA@O11GR2SE:SQL>/

            USERNAME SID SERIAL# PROGRAM SQL_ID
            —————- —— ——– —————————————————————- ————-
            SQL_FULLTEXT EXECUTIONS
            ——————————————————————————– ———-
            SYSTEM 10 9 sqlplus.exe c749bc43qqfz3
            SELECT SYSDATE FROM DUAL 5402

            SYS:AS SYSDBA@O11GR2SE:SQL>/

            USERNAME SID SERIAL# PROGRAM SQL_ID
            —————- —— ——– —————————————————————- ————-
            SQL_FULLTEXT EXECUTIONS
            ——————————————————————————– ———-
            SYSTEM 10 9 sqlplus.exe c749bc43qqfz3
            SELECT SYSDATE FROM DUAL 7238

            SYS:AS SYSDBA@O11GR2SE:SQL>

            ==> e depois que acabou a execução do arquivo .SQL :

            SYSDATE
            ——–
            16/05/18

            SYSTEM:@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 75547

            SYS: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

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress