André e Chiappa, obrigado pela ajuda, problema resolvido.

________________________________
 De: J. Laurindo Chiappa <jlchia...@yahoo.com.br>
Para: oracle_br@yahoogrupos.com.br 
Enviadas: Segunda-feira, 18 de Junho de 2012 19:07
Assunto: [oracle_br] Re: Problema perfomance SQL
 

  
Tá, mas além do índice Existir, ele está sendo usado no Plano de Execução ** 
real **, que vc tirou das V$ (e não o chute dado por alguma tool cliente) ?? 
Qual é a chave Completa do índice ?? Mais que isso, é Esperado que o índice 
seja usado ?? Afinal, cfrme nós sabemos, um índice é útil e deve ser usado SE, 
e apenas SE, a qtdade de linhas a recuperar for comparativamente MUITO MENOR do 
que o total da tabela e/ou SE o índice pode ser mais rapidamente scaneado via 
fast full index scan do que um full table scan.....
Isso nos leva à questão de cardinalidades  : qual o tamanho total das tabelas 
envolvidas, E quantas linhas são esperadas nesse antijoin (que é o que eu 
imagino ser o trecho aonde vc quer saber quem NÃO está no conjunto, que vc 
codificou com um NOT EXISTS) ??? 
E o ponto mais importante : será que o que vc está obtendo com o NOT EXISTS é, 
logicamente falando, um nested loop, ie, CADA linha da query principal é 
procurada na tabela de lookup, que no seu exemplo seria a arrecadacao.pagamento 
pagto ? Se for isso, se a tabela de lookup for grande é Claro que operação 
linha-a-linha é Intrisecamente mais lenta para qtdades não-triviais, vc Tentou 
"materializar" isso de modo que possa ser feita uma busca geral, talvez com a 
cláusula WITH, talvez simplesmente se criando uma tabela temporária com os 
dados ? 

Numa próxima msg, se vc ainda estiver tendo o problema, mostra pra gente uma 
versão *** MENOR *** do SELECT em que ainda ocorra o problema (tem que ser uma 
versão CUSTOMIZADA, aonde vc tirou tudo o desnecessário, ninguém tem tempo pra 
ficar analisando uma query real de produção com meia dúzia de tabelas), mostra 
o plano de Execução ** real ** para nós e dê Todos os detalhes de acesso, 
índices e Cardinalidades, que a gente pode tentar palpitar em cima...

[]s

Chiappa

--- Em oracle_br@yahoogrupos.com.br, Rafael Vieira <vieira.rafael44@...> 
escreveu
>
> André, obrigado pelo retorno.
> Respondendo a sua pergunta, tem sim.
> 
> 
> 
> 
> ________________________________
>  De: Andre Santos <andre.psantos.ti@...>
> Para: oracle_br@yahoogrupos.com.br 
> Enviadas: Segunda-feira, 18 de Junho de 2012 17:35
> Assunto: Re: [oracle_br] Problema perfomance SQL
> 
> Rafael
> 
> Uma primeira pergunta: na tabela "pagamento" há um índice por "cnta_id"?
> 
> [ ]
> 
> André
> 
> 2012/6/18 vieira.rafael44 <vieira.rafael44@...>
> 
> > **
> >
> >
> > Amigos, boa tarde.
> > Venho aqui pedir uma ajuda de vocês, estou com um probleminha de
> > performance na query abaixo:
> >
> > Obs: O grande problema, é a última condição "AND", onde se usa o "NOT
> > EXISTS", sem o "NOT EXISTS" a query roda em 01 min e 36seg. Quanto a
> > questão de estatísticas e índice está ok.
> >
> > SELECT Count(conta.imov_id) AS idImovel
> > FROM faturamento.conta conta
> > INNER JOIN cadastro.imovel imov
> > ON imov.imov_id = conta.imov_id
> > INNER JOIN cadastro.localidade loca
> > ON loca.loca_id = imov.loca_id
> > INNER JOIN cadastro.setor_comercial stcm
> > ON stcm.stcm_id = imov.stcm_id
> > INNER JOIN cadastro.quadra qdra
> > ON qdra.qdra_id = imov.qdra_id
> > LEFT OUTER JOIN cobranca.cobranca_situacao cbst
> > ON cbst.cbst_id = imov.cbst_id
> > WHERE ( imov.cbst_id IS NULL
> > OR cbst.cbst_icnaocobranca <> 1 )
> > AND imov.imov_id NOT IN (SELECT cbsh.imov_id
> > FROM cobranca.cobranca_situacao_hist cbsh
> > WHERE cbsh.imov_id = imov.imov_id
> > AND cbsh.cbsh_amcobrancaretirada IS NULL)
> > AND imov.imov_icexclusao <> 1
> > AND imov.imov_idcategoriaprincipal IN ( 1, 2, 3 )
> > AND conta.dcst_idatual IN ( 0, 1, 2 )
> > AND loca.greg_id = 44
> > AND imov.iper_id IN ( 1, 3, 4, 5 )
> > AND imov.last_id IN ( 5, 3 )
> > AND conta.cnta_amreferenciaconta BETWEEN 200203 AND 201203
> > AND NOT EXISTS (SELECT pagto.pgmt_id
> > FROM arrecadacao.pagamento pagto
> > WHERE pagto.cnta_id = conta.cnta_id)
> >
> > 
> >
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
> 
> 
> 
> ------------------------------------
> 
> ----------------------------------------------------------
> >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
> >responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
> ----------------------------------------------------------
> >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
> >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
> >http://www.oraclebr.com.br/  
> ---------------------------------------------------------- Links do Yahoo! 
> Grupos
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


 

[As partes desta mensagem que não continham texto foram removidas]

Responder a