The Queen 0 Denunciar post Postado Agosto 27, 2008 Estava melhorando a performance de um select gigantesco que consulta tabelas com milhões de dados e resolvi fazer um subselect para melhorar a performance e a apresentação do select. estava tudo certo até eu ter que usar a função SUM. O negócio está a 20 min rodando e nada. Alguém tem alguma ídéia pra melhorar a performance deste select? SELECT A.CONTRATO aCONTRATO, SUM(B.PREMIO_PAGO) aPREMIO FROM BMCTOOLS.PARCELA A INNER JOIN BMCTOOLS.TB_GENERALI_ENVIADOS B ON A.CONTRATO = B.CONTRATO AND A.PARCELA = B.NUM_PARCELA WHERE B.CANCELADO = 'N' AND A.NATUREZA_RCB IN (SELECT COD_NAT_CANC FROM BMCTOOLS.TB_GENERALI_COD_NATUREZA) GROUP BY A.CONTRATO Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 27, 2008 1) Já viu o plano de execução da QUERY ? 2) Para que a subquery se você está buscando todas as naturezas , não seria o caso de se trocar por um << AND A.NATUREZA_RCB IS NOT NULL >> ? Compartilhar este post Link para o post Compartilhar em outros sites
The Queen 0 Denunciar post Postado Agosto 27, 2008 1 - AQUI ESTÁ SELECT STATEMENT 47098 1 79 SORT GROUP BY 47098 1 79 HASH JOIN SEMI 47095 1 79 MERGE JOIN PARCELA 47093 1 66 TABLE ACCESS BY INDEX ROWID PARCELA_PK 83 45061302 144961664 INDEX FULL SCAN 26 3244 1815 SORT JOIN TB_GENERALI_ENVIADOS 47010 6127234 288325956 TABLE ACCESS FULL TB_GENERALI_COD_NATUREZA 9054 6127234 288325956 TABLE ACCESS FULL 2 15 195 2 - NÃO TRAGO TODAS AS NATUREZAS, ELE BUSCA NUMA TABELA QUE TEM SOMENTE AS NATUREZAS DE CANCELAMENTO E ESTE CAMPO NATUREZA_RCB DA TABELA DE PARCELAS TEM PODE CONTER OUTROS TIPOS DE NATUREZAS Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 27, 2008 Creio que as estasticas estão atuais. Já tentou mudar o subselect por mais um join , em geral isto é mais rápido. Fora isto não vi muito como melhorar. Compartilhar este post Link para o post Compartilhar em outros sites
The Queen 0 Denunciar post Postado Agosto 27, 2008 aparentemente o problema acontece quando tento fazer o subselect na tabela tb_generali_cod_natureza. não importa se eu faço join ou subselect, quando tento acessar os dados desta tabela fica muito lento. deve haver algo para melhorar o acesso a esta tabela já que ela é criada por mim. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 27, 2008 Fernanda : Como é uma tabela de tipos deve ter pouco registros por isto o Oracle faz FULL TABLE SCAN. As estatisticas das tabelas são atuais ? Já tentou rodar a query a parte montando o IN na mão ? Exemplo : A query SELECT COD_NAT_CANC FROM BMCTOOLS.TB_GENERALI_COD_NATUREZA Retorna 1 2 3 4 5 Monte a query SELECT A.CONTRATO aCONTRATO, SUM(B.PREMIO_PAGO) aPREMIO FROM BMCTOOLS.PARCELA A INNER JOIN BMCTOOLS.TB_GENERALI_ENVIADOS B ON A.CONTRATO = B.CONTRATO AND A.PARCELA = B.NUM_PARCELA WHERE B.CANCELADO = 'N' AND A.NATUREZA_RCB IN (1,2,3,4,5) GROUP BY A.CONTRATO E veja se roda mais rápido. Compartilhar este post Link para o post Compartilhar em outros sites
The Queen 0 Denunciar post Postado Agosto 27, 2008 não posso fazer isso pois os registros que usarei para a tabela de natureza é dinâmico. mas criei um indice para esta tabela e as estatisticas melhoraram um pouco. também tente colocal manualmente e a performance continuou baixa. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 27, 2008 Achei que era dinamico, mas seria só para testar se a demora está no subselect. Compartilhar este post Link para o post Compartilhar em outros sites
The Queen 0 Denunciar post Postado Agosto 29, 2008 Criei um monstrinho contra qualquer regra de tunnig aqui. Ele é lento mas roda. Já este é bonitinho e tudo mas não roda. Deixa estar, tento me virar aqui. Valeu Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 29, 2008 Tente rodar com os dados do IN escritos na mão (sem o sub-select) para saber se o zebra está no sub-select. Compartilhar este post Link para o post Compartilhar em outros sites
Andre Renato 0 Denunciar post Postado Setembro 12, 2008 Experimente usar a cláusula EXISTS para acessar o sub-select, ela costuma ser mais rápida que o IN. Compartilhar este post Link para o post Compartilhar em outros sites