- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 18 anos, 11 meses atrás por gregorymig.
-
AutorPosts
-
15 de fevereiro de 2006 às 3:04 pm #75252gregorymigParticipante
E ae pessoal,
não tenho muita experiência com Oracle e gostaria de esclarecer algumas dúvidas…
Qual a diferença de performance usando JOIN ou WHERE??PQ com ambas posso retornar o mesmo resultado.
O Where não usa o índice para a pesquisa?
Valew! =D
15 de fevereiro de 2006 às 6:12 pm #75257ebertfmParticipanteGregory, Tudo bem?
Este é um assunto muito extenso. Toda a parte de performance é muito extensa para ser discutida com uma resposta simples.
Pelo que vc disse vc está notando diferenças entre as duas queries escritas de forma diferente para um mesmo resultado.
Isso depende de inúmeros fatores: Para citar somente alguns:
-A versão do banco (por incrível que pareça cada versão funciona de forma diferente).
-Se as tabelas estão analisadas ou não;
-Se as estatísticas estão atualizadas;
-Se os índices estão analisados;
-A parametrização do banco ( ex. parâmetro optmizer_mode);
– Etc.Etc.etc.etc.etc.etc.etc.etc……Portanto vc vê que não é tão simples.
Pelo que vc está perguntando vc esta fazendo uma query que vc faz um join de algumas tabelas de duas formas diferentes (uma utilizando a cláusula JOIN, outra fazendo a comparação no WHERE).
Respondendo à parte simples da sua pergunta:
“O Where não usa o índice para a pesquisa? “
Não é muito por aí. O Banco vai usar um índice para resolver um select dependendo dos fatores acima.
O que pode estar acontecendo é a forma como vc está escrevendo e ele está indo por caminhos diferentes.
Pela forma como vc escreveu, parece que com a sintaxe utilizando o where está pior. Portanto vc pode ver o que está acontecendo fazendo o trace dos dois comandos e assim comparando para ver o que aconteceu. Assim vc pode verificar se de uma forma está utilizando o índice e da oura não está.
Uma forma simples para verificar como ele está executando cada query seria: (na versão 9.2 do banco e com a plan_table criada e pelo SQL*Plus):
SQL> select * from teste;
CHAVE CAMPOA CAMPOB
1 a a 2 b a 3 b a 4 b a 5 c a
[b]Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=32)
1 0 TABLE ACCESS (FULL) OF ‘TESTE’ (Cost=2 Card=1 Bytes=32)[/b]
SQL>Espero ter ajudado.
Abraços.
15 de fevereiro de 2006 às 6:13 pm #75258ebertfmParticipanteMe desculpe faltou o comando para ligar o trace do SQL*Plus:
Antes de executar o comando que vc quer ver como ele resolveu faça:
SQL> set autotrace on
15 de fevereiro de 2006 às 7:36 pm #75263gregorymigParticipanteNo momento não tenho como fazer o teste, foi apenas uma pergunta…
Sendo q já usei tanto join qto where…
Mas muito obrigado pelo esclarecimento. Agora que vou começar a trabalhar mais com oracle e vou escrever mais por aqui!Valew mesmo! =)
-
AutorPosts
- Você deve fazer login para responder a este tópico.