Nelson, se for SQL executado diretamente pelo sqlplus, NÃO TEM como,
o SQL executado diretamente pelo plus é dinâmico, e SQL dinâmico
implica em PARSE, no way.  Como eu disse na msg, se o SQL for
executado dentro de um programa em outra linguagem (vc cita java),
sim, tem como não fazer PARSE em excesso,no caso de java vc tem que
usar bind variables , tem que usar PreparedStatements para que seja
possível re-uso de SQLs, não esquecer de FECHAR o statement após o
uso... Procure em http://asktom.oracle.com que vc acha refs sobre.

[]s

Chiappa

--- Em [email protected], Nelson Cartaxo
<[EMAIL PROTECTED]> escreveu
>
> Chiappa, perfeito seu exemplo, mas ainda continuo com uma dúvida.
Existe
> alguma maneira de fazer menos parses via sqlplus usando sql? Ou só
mesmo
> dentro de um pl/sql?  Pergunto isso pq certamente tem varios
sistemas aqui
> dentro(usando sqlplus, java, etc) que não usam pl/sql.
>
> Obrigado.
>
> Nelson Cartaxo
> DBA ORACLE
>
>
>
> -----Mensagem original-----
> De: jlchiappa [mailto:[EMAIL PROTECTED]
> Enviada em: Tuesday, May 30, 2006 1:11 PM
> Para: [email protected]
> Assunto: [oracle_br] Re: Parse
>
>
> Exato, André : Nelson, é fácil se ver que a primeira execução
> necessariamente implica em hard parse, E que é o sqlplus que está
> fazendo reparse (soft, mas é reparse) a cada execução, cfrme :
>
> ==> numa sessão conexão dedicada, que já está com trace ativo, vou
> executar um SQL que sei que não existia ainda no cache:
>
> [EMAIL PROTECTED]:SQL>select deptno, dname, 'fixo' from dept;
>
>             DEPTNO DNAME          'FIX
> ------------------ -------------- ----
>                 10 ACCOUNTING     fixo
>                 20 RESEARCH       fixo
>                 30 SALES          fixo
>                 40 OPERATIONS     fixo
>                 77 Depto 77       fixo
>                 78 Ação           fixo
>                 50 Pólen          fixo
>                 43 Depto 43       fixo
>
> 8 linhas selecionadas.
>
> ==> necessariamente isso gerou um hard parse, agora vou executar
> EXATAMENTE o mesmo SQL na mesma sessão, veremos que o sqlplus VAI
> fazer parse 9soft, mas é parse) a cada vez :
>
> [EMAIL PROTECTED]:SQL>/
>
>             DEPTNO DNAME          'FIX
> ------------------ -------------- ----
>                 10 ACCOUNTING     fixo
>                 20 RESEARCH       fixo
>                 30 SALES          fixo
>                 40 OPERATIONS     fixo
>                 77 Depto 77       fixo
>                 78 Ação           fixo
>                 50 Pólen          fixo
>                 43 Depto 43       fixo
>
> 8 linhas selecionadas.
>
> [EMAIL PROTECTED]:SQL>/
>
>             DEPTNO DNAME          'FIX
> ------------------ -------------- ----
>                 10 ACCOUNTING     fixo
>                 20 RESEARCH       fixo
>                 30 SALES          fixo
>                 40 OPERATIONS     fixo
>                 77 Depto 77       fixo
>                 78 Ação           fixo
>                 50 Pólen          fixo
>                 43 Depto 43       fixo
>
> 8 linhas selecionadas.
>
> [EMAIL PROTECTED]:SQL>/
>
>             DEPTNO DNAME          'FIX
> ------------------ -------------- ----
>                 10 ACCOUNTING     fixo
>                 20 RESEARCH       fixo
>                 30 SALES          fixo
>                 40 OPERATIONS     fixo
>                 77 Depto 77       fixo
>                 78 Ação           fixo
>                 50 Pólen          fixo
>                 43 Depto 43       fixo
>
> 8 linhas selecionadas.
>
> [EMAIL PROTECTED]:SQL>/
>
>             DEPTNO DNAME          'FIX
> ------------------ -------------- ----
>                 10 ACCOUNTING     fixo
>                 20 RESEARCH       fixo
>                 30 SALES          fixo
>                 40 OPERATIONS     fixo
>                 77 Depto 77       fixo
>                 78 Ação           fixo
>                 50 Pólen          fixo
>                 43 Depto 43       fixo
>
> 8 linhas selecionadas.
>
> [EMAIL PROTECTED]:SQL>disc;
> Desconectado de Oracle9i Enterprise Edition Release 9.2.0.5.0 -
64bit
> Production
> With the Partitioning option
> JServer Release 9.2.0.5.0 - Production
>
> ==> como ficou no tkprof :
>
>
**********************************************************************
> **********
>
> select deptno, dname, 'fixo'
> from
>  dept
>
>
> call     count       cpu    elapsed       disk      query   
> current        rows
> ------- ------  -------- ---------- ---------- ---------- ----------
>   ----------
> Parse        5      0.01       0.01          0          0         
> 0           0
> Execute      5      0.00       0.00          0          0         
> 0           0
> Fetch       10      0.01       0.00          0         25         
> 0          40
> ------- ------  -------- ---------- ---------- ---------- ----------
>   ----------
> total       20      0.02       0.01          0         25         
> 0          40
>
> Misses in library cache during parse: 1
> Optimizer goal: CHOOSE
> Parsing user id: 69
>
> Rows     Row Source Operation
> -------  ---------------------------------------------------
>       8  TABLE ACCESS FULL DEPT
>
> ==> 1 miss = 1 hard parse, portanto desses 5 parses 4 foram soft.
No
> caso tive 5 execuções (o que é bom, indica que a aplicação está
> enviando SQLs semelhantes), mas 5 parses pra essas 5 execuções,
isso
> é HORROROSO, num sistema produção a regra é ZERO (ou no máximo 1)
> parse pra N execuções, cfrme :
>
> ==> em outra sessão crio um PL/SQL :
>
> [EMAIL PROTECTED]:SQL>create or replace procedure P_NO_PARSE is
>   2  BEGIN
>   3     for r in (select DEPTNO, dname, 'abobora' from dept) loop
>   4        dbms_output.put_line(r.deptno || ',' || r.dname);
>   5     end loop;
>   6  END;
>   7  /
>
> Procedimento criado.
>
> ==> e executo o SQL via stored PL/SQL 5 vezes :
>
> [EMAIL PROTECTED]:SQL>exec P_NO_PARSE;
>
> Procedimento PL/SQL concluído com sucesso.
>
> [EMAIL PROTECTED]:SQL>exec P_NO_PARSE;
>
> Procedimento PL/SQL concluído com sucesso.
>
> [EMAIL PROTECTED]:SQL>exec P_NO_PARSE;
>
> Procedimento PL/SQL concluído com sucesso.
>
> [EMAIL PROTECTED]:SQL>exec P_NO_PARSE;
>
> Procedimento PL/SQL concluído com sucesso.
>
> [EMAIL PROTECTED]:SQL>exec P_NO_PARSE;
>
> Procedimento PL/SQL concluído com sucesso.
>
> [EMAIL PROTECTED]:SQL>disc;
> Desconectado de Oracle9i Enterprise Edition Release 9.2.0.5.0 -
64bit
> Production
> With the Partitioning option
> JServer Release 9.2.0.5.0 - Production
>
> ==> resultado do tkprof :
>
>
**********************************************************************
> **********
>
> SELECT DEPTNO, DNAME, 'abobora'
> FROM
>  DEPT
>
>
> call     count       cpu    elapsed       disk      query   
> current        rows
> ------- ------  -------- ---------- ---------- ---------- ----------
>   ----------
> Parse        1      0.01       0.00          0          0         
> 0           0
> Execute      5      0.00       0.00          0          0         
> 0           0
> Fetch       45      0.01       0.00          0         55         
> 0          40
> ------- ------  -------- ---------- ---------- ---------- ----------
>   ----------
> total       51      0.02       0.00          0         55         
> 0          40
>
> Misses in library cache during parse: 1
> Optimizer goal: CHOOSE
> Parsing user id: 69     (recursive depth: 1)
>
> Rows     Row Source Operation
> -------  ---------------------------------------------------
>      40  TABLE ACCESS FULL DEPT
>
> ==> agora estamos na boa em relação a parse, N execuções e apenas
um
> parse... E note também que, ALÉM de evitar parse, AUTOMAGICAMENTE o
> PL/SQL já transformou o texto do meu SQL em maiúsculas (e se
houvesse
> teria removido eventuais brancos e itens desnecessários), é OUTRA
> vantagem que vc obtém com PL/SQL. Foi este exemplo que usei na
minha
> apresentação na ENPO de 2005, é por isso que se recomenda SEMPRE
> trabalhar com PL/SQL se possível - não é que seja impossível (LONGE
> DISSO) de se obter os mesmos benefícios em SQLs armazenados em
> programas java, vb, delphi, o que for, mas nessas lings todas
> normalmente vc TEM QUE tomar uma ação extra, TEM QUE escrever algo
a
> mais, adicionar algum componente a mais, enfim, fazer algo, o que é
> AUTOMÁGICO no PL/SQL com SQLs estáticos.
>
> []s
>
>  Chiappa
>
> --- Em [email protected], "Andre Santos"
> <[EMAIL PROTECTED]> escreveu
> >
> > Nelson
> >
> > Além disso que o Chiappa esclareceu, também há diferença
> entre "hard parse"
> > e "soft parse"... Como a instrução é exatamente a mesma, deverá
ser
> feito um
> > "soft parse" (que tem um custo menor), não é?
> >
> > [ ]
> >
> > André
> >
> >
> >
> > Em 30/05/06, Nelson Cartaxo <[EMAIL PROTECTED]> escreveu:
> > >
> > >  Mais uma vez obrigado chiappa. Vou fazer este teste.
> > >
> > > Abraços,
> > >
> > > Nelson Cartaxo
> > > DBA ORACLE
> > >
> > >
> > >
> > > -----Mensagem original-----
> > > De: jlchiappa [mailto:[EMAIL PROTECTED]
> > > Enviada em: Monday, May 29, 2006 9:41 PM
> > > Para: [email protected]
> > > Assunto: [oracle_br] Re: Parse
> > >
> > >
> > >
> > > É bem simples o motivo : o sqlplus é uma tool que por definição
> TEM
> > > que receber SQLs ad-hoc, que não se sabe a priori quais
> serão,então
> > > ela TEm que usar SQL dinâmico, e SQL dinâmico implica em parse
> > > sempre... Repita o teste num stored PL/SQL, repetindo
exatamente o
> > > mesmo SQL 50 vezes (pode ser num LOOP) que vc vai ver que aí sim
> > > (claro) o SQL é estático, é CONHECIDO a priori e portanto há
> > > re-aproveitamento automático e natural de SQL.
> > >
> > > []s
> > >
> > > Chiappa
> > >
> > > --- Em [email protected], Nelson Cartaxo
> > > <[EMAIL PROTECTED]> escreveu
> > > >
> > > > Pessoal boa tarde,
> > > >
> > > > Poderiam me tirar uma duvida? Oracle versão 8.1.7.4
> > > >
> > > > Tenho um select simples
> > > >
> > > > select dt_inicio, dt_fim from tb_vigencia
> > > > where co_vigencia=10
> > > >
> > > > Gostaria de tentar entender, do pq de quando eu executo por
> exemplo
> > > 50 vezes
> > > > esta mesma query, com o uso do "/" dentro do sqlplus, no
trace
> ele
> > > faz 50
> > > > parses.  Não deveria fazer apenas 1 parse, tendo em vista que
> não
> > > mudei nada
> > > > na query?
> > > >
> > > > Segue o resultado do trace
> > > >
> > > > call     count       cpu    elapsed       disk      query   
> current
> > > > rows
> > > > ------- ------  -------- ---------- ---------- ---------- ----
--
> ----
> > > > ----------
> > > > Parse       32      0.02       0.03          0         
> 0          0
> > > > 0
> > > > Execute     32      0.00       0.00          0         
> 0          0
> > > > 0
> > > > Fetch       64      0.00       0.00          0        
> 64          0
> > > > 32
> > > > ------- ------  -------- ---------- ---------- ---------- ----
--
> ----
> > > > ----------
> > > > total      128      0.02       0.03          0        
> 64          0
> > > > 32
> > > >
> > > > Fizemos uns testes inclusive com variavel bind e mesmo assim
o
> numero de
> > > > parses é o mesmo.
> > > >
> > > > Valeu pela força.
> > > >
> > > > Nelson Cartaxo
> > > > DBA ORACLE
> > > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > ----------------------------------------------------------------
--
> ----------
> > > ----------------------------------------------
> > > Atenção! As mensagens deste grupo são de acesso público e de
> inteira
> > > responsabilidade de seus remetentes.
> > > Acesse: http://www.mail-
archive.com/[email protected]/
> > >
> > > ----------------------------------------------------------------
--
> ----------
> > >
> > > ----------------------------------------------
> ______________________________
> > > ____________________________________
> > >
> > > Este Grupo recebe o apoio da SQL Magazine -
> > > www.devmedia.com.br/sqlmagazine
> > >
__________________________________________________________________
> > > O grupo Oracle_br não aceita anexos. Quando oferecer algum
> arquivo, tenha
> > > o
> > > link do mesmo para evitar trafego(pedidos) desnecessário.
> > > Links do Yahoo! Grupos
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > ----------------------------------------------------------------
--
> --------------------------------------------------------
> > > Atenção! As mensagens deste grupo são de acesso público e de
> inteira
> > > responsabilidade de seus remetentes.
> > > Acesse: http://www.mail-
archive.com/[email protected]/
> > >
> > > ----------------------------------------------------------------
--
> --------------------------------------------------------
> __________________________________________________________________
> > >
> > > Este Grupo recebe o apoio da SQL Magazine -
> > > www.devmedia.com.br/sqlmagazine
> > >
__________________________________________________________________
> > > O grupo Oracle_br não aceita anexos. Quando oferecer algum
> arquivo, tenha
> > > o link do mesmo para evitar trafego(pedidos) desnecessário.
> > >
> > >
> > >   *Yahoo! Grupos, um serviço oferecido por:*   PUBLICIDADE
> > >
> > >
>
<http://br.ard.yahoo.com/SIG=12frhfk64/M=396559.7942981.9522421.236989
>
3/D=brclubs/S=2137114689:HM/Y=BR/EXP=1149001017/A=3729502/R=2/id=noscr
> ipt/SIG=154dcqslu/*http://lt.dell.com/lt/lt.aspx?
>
CID=13040&LID=340715&DGC=BA&DGSeg=DHS&DURL=http://www1.la.dell.com/con
> tent/products/category.aspx/desktops?c%3dbr%26l%3dpt%26s%3ddhs>
> > > ------------------------------
> > > *Links do Yahoo! Grupos*
> > >
> > >    - Para visitar o site do seu grupo na web, acesse:
> > >    http://br.groups.yahoo.com/group/oracle_br/
> > >
> > >    - Para sair deste grupo, envie um e-mail para:
> > >    [EMAIL PROTECTED]<oracle_br-
> [EMAIL PROTECTED]>
> > >
> > >    - O uso que você faz do Yahoo! Grupos está sujeito aos
Termos
> do
> > >    Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>.
> > >
> > >
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>
>
>
>
>
>
>
> --------------------------------------------------------------------
--------
> ----------------------------------------------
> Atenção! As mensagens deste grupo são de acesso público e de inteira
> responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/[email protected]/
> --------------------------------------------------------------------
--------
> ----------------------------------------------
______________________________
> ____________________________________
>
> Este Grupo recebe o apoio da SQL Magazine -
www.devmedia.com.br/sqlmagazine
> __________________________________________________________________
> O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo,
tenha o
> link do mesmo para evitar trafego(pedidos) desnecessário.
> Links do Yahoo! Grupos
>







--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/[email protected]/
--------------------------------------------------------------------------------------------------------------------------__________________________________________________________________

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine
__________________________________________________________________
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário.



Yahoo! Grupos, um serviço oferecido por:
PUBLICIDADE


Links do Yahoo! Grupos

Responder a