Marcado: execution plan, tuning
- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 14 anos, 11 meses atrás por
vieri.
-
AutorPosts
-
13 de abril de 2011 às 12:50 am #98831
msjunior
ParticipantePessoal, 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_carregamentoComo 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?13 de abril de 2011 às 9:02 am #98833vieri
Participantequando for executar ela no sqlplus, rode o seguinte comando antes:
set timing on
set autot on exp statsvamos analisar o plano dela… 😉
13 de abril de 2011 às 9:02 am #98834vieri
Participantequando for executar ela no sqlplus, rode o seguinte comando antes:
set timing on
set autot on exp statsvamos analisar o plano dela… 😉
13 de abril de 2011 às 3:30 pm #98835msjunior
ParticipanteDa 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>13 de abril de 2011 às 3:38 pm #98836msjunior
ParticipanteDa 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;
13 de abril de 2011 às 4:09 pm #98837msjunior
Participante13 de abril de 2011 às 10:56 pm #98861vieri
Participantenã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_carregamentoe 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.
-
AutorPosts
- Você deve fazer login para responder a este tópico.
