Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #98831
    msjunior
    Participante

      Pessoal, tenho a seguinte query:

      SELECT car.numero_carregamento,
      car.codigo_motorista,
      car.codigo_veiculo,
      car.data_montagem,
      COUNT (DISTINCT DEV.numero_pedido) AS devolucoes,
      SUM (dev.valor_total_produto) AS valor_devolucoes
      FROM devolucao_cliente dev, don_carregamento car
      WHERE car.numero_carregamento = dev.numero_carregamento
      AND car.status <> 'C'
      AND car.codigo_motorista = 2
      AND car.data_montagem BETWEEN '01-mar-2011' AND '31-mar-2011'
      GROUP BY car.numero_carregamento,
      car.codigo_motorista,
      car.codigo_veiculo,
      car.data_montagem,
      dev.numero_carregamento

      Como voces podem ver ela é bem simples e minhas tabelas tem poucos dados. A devolução_cliente é uma view e don_carregamento é uma tabela normal. Acontece que quando executo essa query, no sql navigator, sql developer, sqlplus ou em qualquer outra ferramenta, da primeira vez que eu executo ela roda normal. Bom, da segunta vez ela demora uns 5 segundos mas retorna ainda. Da terceira em diante, ela fica executando infinitamente, até eu resolver finalizar.
      Eu já percebi que o problema está nos group by e nos filtros, pois quando executo sem eles, sempre retorna rápido. Porém não vejo nada de errado, não entendo o que pode ser, acho q é algum problema do oracle.
      Alguem tem uma idéia?

      #98833
      vieri
      Participante

        quando for executar ela no sqlplus, rode o seguinte comando antes:

        set timing on
        set autot on exp stats

        vamos analisar o plano dela… 😉

        #98834
        vieri
        Participante

          quando for executar ela no sqlplus, rode o seguinte comando antes:

          set timing on
          set autot on exp stats

          vamos analisar o plano dela… 😉

          #98835
          msjunior
          Participante

            Da primeira execução retornou isso:

            
            SQL> set timing on;
            SQL> set autot on exp stats;
            SP2-0158: opþÒo SET desconhecida "stats"
            SQL> set autot on exp stats;
            SP2-0158: opþÒo SET desconhecida "stats"
            SQL> set autot on;
            SQL> SELECT car.numero_carregamento,
            2 car.codigo_motorista,
            3 car.codigo_veiculo,
            4 car.data_montagem,
            5 COUNT (DISTINCT DEV.numero_pedido) AS devolucoes,
            6 SUM (dev.valor_total_produto) AS valor_devolucoes
            7 FROM devolucao_cliente dev, don_carregamento car
            8 WHERE car.numero_carregamento = dev.numero_carregamento
            9 AND car.status 'C'
            10 AND car.codigo_motorista = 2
            11 AND car.data_montagem BETWEEN '01-mar-2011' AND '31-mar-2011'
            12 GROUP BY car.numero_carregamento,
            13 car.codigo_motorista,
            14 car.codigo_veiculo,
            15 car.data_montagem,
            16 dev.numero_carregamento;
            
            nÒo hß linhas selecionadas
            
            Decorrido: 00:00:10.59
            <h2>Plano de Execução</h2>
            Plan hash value: 1678643708
            
            <hr />
            
            <hr />
            
            | Id | Operation | Name
            | Rows | Bytes | Cost (%CPU)| Time |
            
            <hr />
            
            <hr />
            
            | 0 | SELECT STATEMENT |
            | 1 | 67 | 60 (5)| 00:00:01 |
            
            | 1 | HASH GROUP BY |
            | 1 | 67 | 60 (5)| 00:00:01 |
            
            | 2 | VIEW | VW_DAG_0
            | 1 | 67 | 59 (4)| 00:00:01 |
            
            | 3 | HASH GROUP BY |
            | 1 | 225 | 59 (4)| 00:00:01 |
            
            |* 4 | FILTER |
            | | | | |
            
            | 5 | NESTED LOOPS |
            | 1 | 225 | 58 (2)| 00:00:01 |
            
            | 6 | NESTED LOOPS |
            | 1 | 222 | 58 (2)| 00:00:01 |
            
            | 7 | NESTED LOOPS |
            | 1 | 192 | 57 (2)| 00:00:01 |
            
            | 8 | NESTED LOOPS |
            | 1 | 189 | 57 (2)| 00:00:01 |
            
            | 9 | NESTED LOOPS |
            | 1 | 186 | 57 (2)| 00:00:01 |
            
            | 10 | NESTED LOOPS |
            | 1 | 156 | 55 (2)| 00:00:01 |
            
            | 11 | NESTED LOOPS |
            | 1 | 145 | 54 (2)| 00:00:01 |
            
            | 12 | NESTED LOOPS |
            | 1 | 141 | 54 (2)| 00:00:01 |
            
            | 13 | NESTED LOOPS |
            | 1 | 110 | 53 (2)| 00:00:01 |
            
            | 14 | NESTED LOOPS |
            | 1 | 94 | 52 (2)| 00:00:01 |
            
            |* 15 | HASH JOIN |
            | 45 | 2340 | 7 (15)| 00:00:01 |
            
            |* 16 | TABLE ACCESS FULL | TIPO_OPERACAO
            | 15 | 270 | 3 (0)| 00:00:01 |
            
            | 17 | TABLE ACCESS FULL | DON_NOTA_FISCAL_ENTRADA
            | 45 | 1530 | 3 (0)| 00:00:01 |
            
            |* 18 | TABLE ACCESS BY INDEX ROWID| DON_MOVIMENTACAO_NOTA_FISCAL
            
            | 1 | 42 | 1 (0)| 00:00:01 |
            
            |* 19 | INDEX RANGE SCAN | PK_MOVIMENTACAO_NOTA_FISCAL
            | 1 | | 1 (0)| 00:00:01 |
            
            | 20 | TABLE ACCESS BY INDEX ROWID | DON_PRODUTO
            | 1 | 16 | 1 (0)| 00:00:01 |
            
            |* 21 | INDEX UNIQUE SCAN | PK_PRODUTO
            | 1 | | 0 (0)| 00:00:01 |
            
            |* 22 | TABLE ACCESS BY INDEX ROWID | DON_CLIENTE
            | 1 | 31 | 1 (0)| 00:00:01 |
            
            |* 23 | INDEX UNIQUE SCAN | U_CODIGO_CLIENTE
            | 1 | | 0 (0)| 00:00:01 |
            
            |* 24 | INDEX UNIQUE SCAN | PK_PRACA
            | 1 | 4 | 0 (0)| 00:00:01 |
            
            |* 25 | TABLE ACCESS BY INDEX ROWID | DON_PEDIDO_VENDA
            | 463 | 5093 | 1 (0)| 00:00:01 |
            
            |* 26 | INDEX UNIQUE SCAN | PK_PEDIDO_VENDA
            | 1 | | 0 (0)| 00:00:01 |
            
            |* 27 | TABLE ACCESS BY INDEX ROWID | DON_PEDIDO_VENDA_ITEM
            | 1 | 30 | 2 (0)| 00:00:01 |
            
            |* 28 | INDEX RANGE SCAN | PK_PEDIDO_VENDA_ITEM
            | 12 | | 1 (0)| 00:00:01 |
            
            |* 29 | INDEX UNIQUE SCAN | PK_PRODUTO_DEPARTAMENTO
            | 1 | 3 | 0 (0)| 00:00:01 |
            
            |* 30 | INDEX UNIQUE SCAN | PK_TIPO_OP_CLASSE
            | 1 | 3 | 0 (0)| 00:00:01 |
            
            |* 31 | TABLE ACCESS BY INDEX ROWID | DON_CARREGAMENTO
            | 1 | 30 | 1 (0)| 00:00:01 |
            
            |* 32 | INDEX UNIQUE SCAN | PK_CARREGAMENTO
            | 1 | | 0 (0)| 00:00:01 |
            
            |* 33 | INDEX UNIQUE SCAN | PK_RCA
            | 1 | 3 | 0 (0)| 00:00:01 |
            
            <hr />
            
            <hr />
            
            <h2>Predicate Information (identified by operation id):</h2>
            4 - filter(TO_DATE('01-mar-2011')<=TO_DATE('31-mar-2011'))
            15 - access("NFE"."TIPO_OPERACAO"="TPO"."CODIGO")
            16 - filter(NVL("TPO"."TIPO_ENTRADA_SAIDA",'S')='E')
            18 - filter("NFE"."CODIGO_FILIAL"="MOV"."CODIGO_FILIAL" AND
            "NFE"."CODIGO_CLIENTE_FORNECEDOR"="MOV"."CODIGO_CLIENTE_FORNECEDOR
            
            ")
            
            19 - access("NFE"."NUMERO_TRANSACAO"="MOV"."NUMERO_TRANSACAO" AND "MOV"."STATU
            
            S"='N')
            filter("MOV"."STATUS"='N')
            

            21 – access(“PRO”.”CODIGO”=”MOV”.”CODIGO_PRODUTO”)
            22 – filter(“NFE”.”PESSOA”=”CLI”.”PESSOA” AND “NFE”.”CNPJ_CPF”=”CLI”.”CNPJ_CPF
            “)

            23 – access(“NFE”.”CODIGO_CLIENTE_FORNECEDOR”=”CLI”.”CODIGO”)
            24 – access(“CLI”.”CODIGO_PRACA”=”PRC”.”CODIGO”)
            25 – filter(NVL(“MOV”.”NUMERO_CARREGAMENTO”,0)=NVL(“PVD”.”NUMERO_CARREGAMENTO_

            PEDIDO”,0))

            26 – access(NVL(“MOV”.”NUMERO_PEDIDO”,0)=”PVD”.”NUMERO” AND
            TO_NUMBER(“NFE”.”CODIGO_FILIAL”)=”PVD”.”CODIGO_FILIAL”)
            27 – filter(“PVI”.”CODIGO_PRODUTO”=”MOV”.”CODIGO_PRODUTO”)
            28 – access(“PVD”.”NUMERO”=”PVI”.”NUMERO_PEDIDO_VENDA”)
            29 – access(“PRO”.”CODIGO_DEPARTAMENTO”=”DEP”.”CODIGO”)
            30 – access(NVL(“TPO”.”CODIGO_CLASSE”,0)=”TPC”.”CODIGO”)
            31 – filter(“CAR”.”CODIGO_MOTORISTA”=2 AND “CAR”.”STATUS”‘C’ AND “CAR”.”DATA

            _MONTAGEM”>=’01-mar-2011′ AND

             "CAR"."DATA_MONTAGEM"
            <pre><code></code> 
            #98836
            msjunior
            Participante

              Da segunda vez que peço pra rodar, ela já não executa mais…já tem uns 10 minutos que está nisso:

              SQL> SELECT car.numero_carregamento,
              2 car.codigo_motorista,
              3 car.codigo_veiculo,
              4 car.data_montagem,
              5 COUNT (DISTINCT DEV.numero_pedido) AS devolucoes,
              6 SUM (dev.valor_total_produto) AS valor_devolucoes
              7 FROM devolucao_cliente dev, don_carregamento car
              8 WHERE car.numero_carregamento = dev.numero_carregamento
              9 AND car.status 'C'
              10 AND car.codigo_motorista = 2
              11 AND car.data_montagem BETWEEN '01-mar-2011' AND '31-mar-2011'
              12 GROUP BY car.numero_carregamento,
              13 car.codigo_motorista,
              14 car.codigo_veiculo,
              15 car.data_montagem,
              16 dev.numero_carregamento;

              #98837
              msjunior
              Participante

                Tirei o plano pelo sql navigator em formato de imagem:

                [url=http://img31.imageshack.us/i/plang.gif/:7ctdzh6m]

                Uploaded with ImageShack.us

                #98861
                vieri
                Participante

                  não consegue criar uma view materializada com a query abaixo:

                  select car.numero_carregamento,
                  car.codigo_motorista,
                  car.codigo_veiculo,
                  car.data_montagem
                  COUNT (DISTINCT DEV.numero_pedido) AS devolucoes,
                  SUM (dev.valor_total_produto) AS valor_devolucoes
                  FROM devolucao_cliente dev, don_carregamento car
                  WHERE car.numero_carregamento = dev.numero_carregamento

                  e depois usar a query em cima da mview?

                  o hash group by explica a lentidão essa operação é custosa..

                  da uma olhada no plano dessa view VW_DAG_0 tb.

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.