- Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 18 anos atrás por collins.
-
AutorPosts
-
8 de janeiro de 2007 às 5:31 pm #77989collinsParticipante
Olá,
Tenho uma consulta grande que demora muito pra retornar o resultado e não sei como melhora-la. Se alguém puder me ajudar ficarei grato.
o código é esse:
Select codprod,
coditprod,
digitprod,
unidade,
qtembcomp,
produto,
codforne,
fantasia,
preco2,
precoalterna,
sum(totprbase) as totprbase,
sum(qtdtotal) as qtdtotal,
sum(vltot) as vltotal,
sum(peso) as peso,
0.00 PRTRANSF,
0.00 MARKUP,
0.00 QTDCX,
0.00 PART,
0.00 PRMEDIO,
0.00 dvend,
0.00 dmed,
sum(OCNF) OCNF,
sum(OCPDV) OCPDV
From (Select ip.codprod,
its.coditprod,
ip.digitprod,
prd.unidade,
e3.qtemb as qtembcomp,
max(nvl(prd.descricao, '') || nvl(ip.tamanho, '') ||
nvl(cor.descres, '') || +nvl(esp.descres, '')) as produto,
frn.codforne,
frn.fantasia,
max(prc.preco2) as preco2,
max(prc.precoalterna) as precoalterna,
sum(nvl(prc.preco2, 0) * (its.qtcomp * its.qtemb)) as totprbase,
sum(its.qtcomp * its.qtemb) as qtdtotal,
sum(nvl(its.vltotal, 0)) as vltot,
sum(prd.pesoliq * its.qtcomp * its.qtemb) as peso,
(Case
when ms.tipoped in (0, 2) then
count(distinct its.numnota)
end) as OCNF,
(Case
when ms.tipoped in (1) then
count(distinct its.numnota)
end) as OCPDV
From MOV_SAIDA ms,
MOV_ITSAIDA its,
CAD_PROD PRD,
CAD_ITPROD IP,
CAD_ESPEC ESP,
CAD_COR COR,
CAD_FORNE frn,
CAD_PRECO PRC,
CAD_FILIAL fil ,
(Select e.codprod, e.tpemb,
max(e.codembal) as codembal,
max(e.qtemb) as qtemb
From cad_embal e
Where e.tpemb = (Select min(e2.tpemb)
From cad_embal e2
Where e.codprod=e2.codprod)
Group by e.codprod, e.tpemb) e3
Where ms.codfil = its.codfil
and ms.tpnota = its.tpnota
and ms.numnota = its.numnota
and ms.serie = its.serie
and ms.dtnota = its.dtnota
and ms.codfil = fil.codfil
and its.coditprod = ip.coditprod
and ip.codprod = prd.codprod
and prd.codforne = frn.codforne
and ip.especific = esp.especific
and ip.codfam = esp.codfam
and ip.codcor = cor.codcor
and prc.coditprod = its.coditprod
and ip.codprod = e3.codprod
and its.status <> 9
and prc.codembal = 0
and prc.codfil = 1
and its.tpnota in (51, 133)
and its.dtnota between '01/12/2006' and '31/12/2006'
Group by ms.tipoped,
ip.codprod,
its.coditprod,
ip.digitprod,
prd.descricao,
prd.unidade,
e3.qtemb,
frn.codforne,
frn.fantasia)
Group by codprod,
coditprod,
digitprod,
unidade,
qtembcomp,
produto,
codforne,
fantasia,
preco2,
precoalterna8 de janeiro de 2007 às 6:26 pm #77991chduarteParticipanteEsta query parece ser um pouco complicada para te ajudar a fazer tuning ainda mais sem olhar o plano de execucao.
Voce pode tentar colar no post o plano de acesso gerado pelo explain plan.
[]
8 de janeiro de 2007 às 6:53 pm #77998collinsParticipante[quote=”chduarte”:2p31vefk]Esta query parece ser um pouco complicada para te ajudar a fazer tuning ainda mais sem olhar o plano de execucao.
Voce pode tentar colar no post o plano de acesso gerado pelo explain plan.
[][/quote]
oi, preciso te dizer que não tenho muito conhecimento ainda de oracle e pl/sql. Se não te responder ou passar as informações corretas, tenha um pouco de paciência que aprendo rápido.
Bom, estou te enviando uma imagem do que você me pediu. se não for isso, me avise pra mandar o correto.
Qualquer coisa, pode falar comigo no msn ou no skype (collins.mackoy)
SELECT STATEMENT, GOAL = CHOOSE Cost=12485 Cardinality=54 Bytes=9882
SORT GROUP BY Cost=12485 Cardinality=54 Bytes=9882
VIEW Object owner=GEMCO Cost=12479 Cardinality=54 Bytes=9882
SORT GROUP BY Cost=12479 Cardinality=54 Bytes=10044
VIEW Object owner=SYS Cost=12635 Cardinality=54 Bytes=10044
SORT GROUP BY Cost=12473 Cardinality=54 Bytes=15552
FILTER
HASH JOIN Cost=12466 Cardinality=54 Bytes=15552
NESTED LOOPS Cost=12443 Cardinality=54 Bytes=14202
NESTED LOOPS Cost=12389 Cardinality=54 Bytes=11394
HASH JOIN Cost=12115 Cardinality=137 Bytes=25482
HASH JOIN Cost=12056 Cardinality=243 Bytes=41796
HASH JOIN Cost=12051 Cardinality=243 Bytes=36693
NESTED LOOPS Cost=12046 Cardinality=243 Bytes=31590
HASH JOIN Cost=11803 Cardinality=243 Bytes=23328
HASH JOIN Cost=1241 Cardinality=10647 Bytes=479115
INDEX FULL SCAN Object owner=GEMCO Object name=CAD_FILIAL_PK Cost=1 Cardinality=62 Bytes=682
TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=MOV_SAIDA Cost=1239 Cardinality=10647 Bytes=361998
INDEX RANGE SCAN Object owner=GEMCO Object name=MOV_SAIDA_IDX_DTFILTPNOTA Cost=483 Cardinality=221
TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=MOV_ITSAIDA Cost=10502 Cardinality=95976 Bytes=4894776
INDEX RANGE SCAN Object owner=GEMCO Object name=MOV_ITSAIDA_IX01 Cost=5047 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_ITPROD Cost=1 Cardinality=1 Bytes=34
INDEX UNIQUE SCAN Object owner=GEMCO Object name=CAD_ITPROD_PK Cardinality=1
TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_COR Cost=4 Cardinality=4437 Bytes=93177
TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_ESPEC Cost=4 Cardinality=6933 Bytes=145593
TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_EMBAL Cost=58 Cardinality=22168 Bytes=310352
TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_PRECO Cost=2 Cardinality=1 Bytes=25
INDEX UNIQUE SCAN Object owner=GEMCO Object name=CAD_PRECO_PK Cost=1 Cardinality=1
TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_PROD Cost=1 Cardinality=1 Bytes=52
INDEX UNIQUE SCAN Object owner=GEMCO Object name=CAD_PROD_PK Cardinality=1
TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_FORNE Cost=22 Cardinality=4106 Bytes=102650
SORT AGGREGATE Cardinality=1 Bytes=7
TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_EMBAL Cost=3 Cardinality=2 Bytes=14
INDEX RANGE SCAN Object owner=GEMCO Object name=CAD_EMBAL_PK Cost=2 Cardinality=2
8 de janeiro de 2007 às 7:06 pm #78000chduarteParticipanteDeu para ver 3 access full na sua query CAD_FORNE, CAD_COR e CAD_ESPEC. É preciso que achar a driven table para determinar em qual criar indice e em quais colunas.
Verifique se para estas tabelas voce tem indice nestas colunas:
Tabela – Coluna
CAD_FORNE – codforne, fantasia
CAD_COR – codcor
CAD_ESPEC – especific, codfamParecem serem boas candidatas para indices.
[]
10 de janeiro de 2007 às 9:22 pm #78082collinsParticipante[quote=”chduarte”:axkuwwm5]Deu para ver 3 access full na sua query CAD_FORNE, CAD_COR e CAD_ESPEC. É preciso que achar a driven table para determinar em qual criar indice e em quais colunas.
Verifique se para estas tabelas voce tem indice nestas colunas:
Tabela – Coluna
CAD_FORNE – codforne, fantasia
CAD_COR – codcor
CAD_ESPEC – especific, codfamParecem serem boas candidatas para indices.
[][/quote]
oi, precisei resolver outros assuntos e demorei um pouco. Verifiquei o que me pediu e vi que existem indices para os campos nas tabelas que você especificou.
Obs: No caso do Fornecedor existe um indice para codforne e outro pra fantasia.
Até tentei usar direto no código como no exemplo abaixo mas continua do mesmo jeito.
O que mais posso fazer?
De já agradecido pela acompanhamento.From MOV_SAIDA ms,
MOV_ITSAIDA its,
CAD_PROD PRD,
CAD_ITPROD IP,
/CAD_ESPEC ESP,/(Select /+ index(CAD_ESPEC_PK)/ codfam, especific, descres From cad_espec) esp,
/CAD_COR COR,/(Select /+ index(CAD_COR_PK)/ codcor, descres From cad_cor) cor,
/CAD_FORNE frn,/(Select /+ index(CAD_FORNE_PK)/ /+ index(CAD_FORNE_IDX_FANT)/ codforne, fantasia From cad_forne) frn,
CAD_PRECO PRC,
CAD_FILIAL fil ,
10 de janeiro de 2007 às 10:17 pm #78091chduarteParticipanteA forma de colocar a hint na query é :
Select /+ index(codfam,CAD_ESPEC_PK) */ codfam, especific, descres From cad_espec) esp,
(Select /+ index(codcor,CAD_COR_PK) / codcor, descres From cad_cor) cor,
(Select /+ index(TABELA,CAD_FORNE_PK) index(TABELA,CAD_FORNE_IDX_FANT) */É preciso respeitar os espacos /*+ xxx */
Voce pode tambem fazer o seguinte. Ante de executar sua query, coloque a seguinte clausula no SQL*Plus
SQL> alter session set optimizer_mode = rule
Voce esta coletando estatisticas nestas tabelas?
[]
15 de janeiro de 2007 às 6:03 pm #78212collinsParticipanteCaro amigo,
executei os passos que me pediu mas ainda não obtive sucesso. Resolvemos então passar para os DBA’s responsáveis (o sistema e o banco são terceirizados e só os DBA’s tem permissão para altera-los). Assim que tiver resultado eu posto aqui para informar. Assim se alguém tiver algum problema parecido já pode ser ajudado.Bom, muito obrigado pela ajuda e até a próxima
Atenciosamente,
Collins Daniel
-
AutorPosts
- Você deve fazer login para responder a este tópico.