Pergunta

Existem boas maneiras de medir objetivamente o desempenho de uma consulta no Oracle 10g? Há uma consulta específica que eu fui sintonia para uma poucos dias. Eu recebi uma versão que parece estar a correr mais rápido (pelo menos com base em meus testes iniciais), mas o EXPLICAR custo é praticamente o mesmo.

  1. Qual é a probabilidade de que o EXPLICAR custo está faltando alguma coisa?
  2. Existem situações particulares onde o custo explicar é desproporcionalmente diferente do desempenho real da consulta?
  3. Eu usei as first_rows dica sobre esta consulta. Será que isso tem um impacto?
Foi útil?

Solução

Qual é a probabilidade de que o EXPLICAR custo está faltando alguma coisa?

Muito improvável. Na verdade, seria um erro nível 1:)

Na verdade, se as suas estatísticas mudaram significativamente desde o tempo você executou o EXPLAIN, o plano de consulta real será diferente. Mas, como soom como a consulta é compliled, o plano vai permanecer o mesmo.

Nota EXPLAIN PLAN pode mostrar-lhe coisas que são provável para acontecer, mas nunca pode acontecer em uma consulta real.

Como, se você executar um EXPLAIN PLAN em uma consulta hierárquica:

SELECT  *
FROM    table
START WITH
        id = :startid
CONNECT BY
        parent = PRIOR id

com índices em ambos id e parent, você verá um FULL TABLE SCAN extra que provavelmente não vai acontecer na vida real.

Use STORED OUTLINE de armazenar e reutilizar o plano não importa o que.

Existem situações particulares onde o custo explicar é desproporcionalmente diferente do desempenho real da consulta?

Sim, isso acontece muito frequentemente em consultas complicar.

CBO (otimizador baseado em custo) usa calculadas estatísticas para avaliar consulta tempo e escolher o plano ideal.

Se você tiver lotes de JOIN de, subqueries e esses tipos de coisas em sua consulta, seu algoritmo não pode prever exatamente qual plano será mais rápido, especialmente quando você bate os limites de memória.

Aqui está a situação particular que você perguntou sobre: ??HASH JOIN, por exemplo, vai precisar de várias passagens sobre o probe table se a tabela de hash não vai caber em pga_aggregate_table, mas a partir de Oracle 10g, eu não me lembro esta sempre a ser tido em conta por CBO.

É por isso que eu dica todas consulta espero correr por mais de segundos 2 em um pior caso.

Eu usei as first_rows dica sobre esta consulta. Será que isso tem um impacto?

Esta dica vai fazer o otimizador a usar um plano que tem menor resposta tempo:. Voltará primeiras linhas o mais rápido possível, apesar do tempo total de consulta sendo maior

Na prática, isso significa quase sempre usando NESTED LOOP é em vez de HASH JOIN do.

O NESTED LOOP têm pior desempenho global sobre grandes conjuntos de dados, mas eles retornam as primeiras linhas mais rápido (uma vez que não precisa de tabela de hash a ser construído).

Como para a consulta do seu pergunta original , veja a minha resposta aqui .

Outras dicas

Q: Existem boas maneiras de medir objetivamente o desempenho de uma consulta no Oracle 10g

?
  • A Oracle rastreamento é a melhor maneira de medir o desempenho. Executar a consulta e deixar a Oracle instrumento da execução. No ambiente SQLPlus, é muito fácil de usar AUTOTRACE.

http://asktom.oracle.com/tkyte/article1/ autotrace.html (artigo movido)
http://tkyte.blogspot.com /2007/04/when-explanation-doesn-sound-quite.html
http: // asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5671636641855

E permitindo traço da Oracle em outros ambientes que não é difícil.

Q: Há uma consulta específica que eu fui ajuste por alguns dias. Eu recebi uma versão que parece estar a correr mais rápido (pelo menos com base em meus testes iniciais), mas o EXPLICAR custo é praticamente o mesmo.

  • A execução real da instrução é o que precisa ser medido. EXPLAIN PLAN faz um trabalho digno de prever o plano de otimizador, mas que na verdade não medida o desempenho.

Q: > 1. Qual é a probabilidade de que o EXPLICAR custo está faltando alguma coisa?

  • Os casos não muito provável, mas eu vi onde EXPLAIN PLAN surge com um plano diferente do que o otimizador.

Q: > 2. Existem quaisquer situações particulares onde o custo explicar é desproporcionalmente diferente do desempenho real da consulta?

  • A resposta curta é que eu não tenho observado qualquer. Mas, novamente, não há realmente uma correlação direta entre o custo EXPLICAR plano e do desempenho real observado. É possível que EXPLAIN PLAN para dar um número muito alto para o custo, mas para ter o prazo de consulta real em menos de um segundo. EXPLAIN PLAN não mede o desempenho real da consulta, para isso você precisa do Oracle vestígios.

Q: > 3. Eu usei as first_rows dica sobre esta consulta. Será que isso tem um impacto?

  • Qualquer dica (como /*+ FIRST_ROWS */) pode influenciar qual plano é selecionado pelo otimizador.

O "custo" devolvido pelo plano de explicação é relativo. É uma indicação de desempenho, mas não um indicador preciso dele. Você não pode traduzir um número de custo em uma série de operações de disco ou um número de segundos de CPU ou o número de eventos de espera.

Normalmente, descobrimos que uma declaração com um custo EXPLAIN PLAN como 1 vai correr "muito rapidamente", e uma declaração com um EXPLICAR custo do plano na ordem de cinco ou seis dígitos vai levar mais tempo para corre. Mas nem sempre.

O que o otimizador está fazendo é comparar um monte de possíveis planos de execução (varredura completa da tabela, usando um índice, loop aninhado, etc.) O otimizador é atribuir um número a cada plano, em seguida, selecionando o plano com o menor número .

Já vi casos em que o plano otimizador mostrado pelo EXPLAIN PLAN faz não coincidir com o plano real usado quando a instrução é executada. Vi que há uma década com Oracle8, particularmente quando a instrução variáveis ??de ligação envolvidos, ao invés de literais.

Para obter um custo real para a execução da instrução, ativar o rastreamento para o seu comunicado. A maneira mais fácil de fazer isso é com SQLPlus AUTOTRACE.

[http://asktom.oracle.com/tkyte/article1/autotrace.html][4]

Fora do ambiente SQLPlus, você pode ligar a Oracle rastreamento:

    alter session set timed_statistics = true;
    alter session set tracefile_identifier = here_is_my_session;
    alter session set events '10046 trace name context forever, level 12'
    --alter session set events '10053 trace name context forever, level 1'
    select /*-- your_statement_here --*/ ...
    alter session set events '10046 trace name context off'
    --alter session set events '10053 trace name context off'

Isso coloca um arquivo de rastreamento no diretório user_dump_dest no servidor. O tracefile produzido terá o plano de declaração e todos os eventos de espera. (O identificador TRACEFILE atribuído é included no nome do arquivo, e torna mais fácil para encontrar o seu arquivo no diretório udump)

    select value from v$parameter where name like 'user_dump_dest'

Se você não tem acesso ao tracefile, você está indo para necessidade de obter ajuda da dba para que você obtenha acesso. (O DBA pode criar um script shell simples que os desenvolvedores podem executar contra um arquivo .trc para tkprof prazo, e alterar as permissões no arquivo de rastreamento e na saída tkprof. Você também pode usar o mais recente trcanlzr. Há o Oracle notas metalink em ambos.

AFAIK, explicar é usando algumas estatísticas de banco de dados para calcular o custo, para que ele possa definitivamente diferente do desempenho real.

Na minha experiência de Explicação foi preciso e benéfico. Se não fosse ele pode não ser a ferramenta é útil. Quando foi a última vez que você analisou as tabelas? Eu vi onde o Explique plano era quase o mesmo antes e depois de uma análise, mas a analise feito um enorme ganho de desempenho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top