- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 18 anos, 5 meses atrás por Anônimo.
-
AutorPosts
-
28 de agosto de 2006 às 10:00 pm #76326Anônimo
Olá Pessoal,
Sou novata mas quero muito aprender.
O DBA da empresa que trabalho diz que o select abaixo está causando muita lentidão no banco.
Utilizo a ferramenta Toad onde fiz o Explain Plain e não deu acesso full em nenhuma tabela. Pelo que vi está fazendo acesso Range Scan em 4 tabelas….mas full em nenhuma.
Se alguém puder me dar algum dica do que melhorar…. pois já tentei de tudo e não sei mais o que fazer.desde já agradeço muito.
28 de agosto de 2006 às 10:06 pm #76328Anônimo[quote=”edilene.ribeiro”:1xp6gehk]Olá Pessoal,
Sou novata mas quero muito aprender.
O DBA da empresa que trabalho diz que o select abaixo está causando muita lentidão no banco.
Utilizo a ferramenta Toad onde fiz o Explain Plain e não deu acesso full em nenhuma tabela. Pelo que vi está fazendo acesso Range Scan em 4 tabelas….mas full em nenhuma.
Se alguém puder me dar algum dica do que melhorar…. pois já tentei de tudo e não sei mais o que fazer.desde já agradeço muito.[/quote]
eis o select:
SELECT espe_evt_cod esp_princ,
DECODE (a.espe_evt_cod,
99999999, a.exame,
DECODE (NVL (b.pcdm_grup_espe_cod, -1), -1, 10014, a.exame)
) proced,
a.exame
FROM hist_exame a, pcdm_pcm b, espe_esp f
WHERE :pr_local_id IS NULL
AND a.mes_ref BETWEEN TO_DATE (:pr_mes_ref, ‘mm/yyyy’)
AND TO_DATE (:pr_mes_ref2, ‘mm/yyyy’)
AND a.grp_emp_id = :pr_grp_emp_id
AND a.prest_id = :pr_prest_id
AND a.vlr_pago > 0
AND b.pcdm_cod(+) = a.exame
AND f.espe_cod(+) = a.exame
UNION
SELECT espe_evt_cod esp_princ,
DECODE (a.espe_evt_cod,
99999999, a.exame,
DECODE (NVL (b.pcdm_grup_espe_cod, -1), -1, 10014, a.exame)
) proced,
a.exame
FROM hist_exame a,
pcdm_pcm b,
pred_prt_edr c,
tiep_prt_edr_tip d,
recf_fxa_cep_rgi e,
espe_esp f
WHERE :pr_local_id IS NOT NULL
AND a.mes_ref BETWEEN TO_DATE (:pr_mes_ref, ‘mm/yyyy’)
AND TO_DATE (:pr_mes_ref2, ‘mm/yyyy’)
AND a.grp_emp_id = :pr_grp_emp_id
AND a.prest_id = :pr_prest_id
AND a.vlr_pago > 0
AND b.pcdm_cod(+) = a.exame
AND f.espe_cod(+) = a.exame
AND c.pred_prtd_cod = a.prest_id
AND d.tiep_pred_cod = c.pred_cod
AND d.tiep_tip_edr = 3
AND e.recf_etor_cod = :pr_etor_cod
AND e.recf_rgio_cod = :pr_local_id
AND e.recf_cepf_cep_ini = c.pred_cepe_cod
GROUP BY espe_evt_cod, a.exame, b.pcdm_grup_espe_cod, f.espe_cod
ORDER BY 1 ASC28 de agosto de 2006 às 10:32 pm #76330Marcio68AlmeidaParticipanteBom…
Há muitos itens na sua consulta que são realmente perniciosos à performance…
1. Quando você utiliza TO_CHAR, TO_DATE, SUBSTR, etc…
2. Quando você usa Outer Join (+)
3. Quando você usa >, =, <=, etc…A opção :
e.recf_cepf_cep_ini = c.pred_cepe_cod
Pode ser substituída por :
c.pred_cepe_cod between e.recf_cepf_cep_ini AND e.recf_cepf_cep_fim
A opção :
a.mes_ref BETWEEN TO_DATE (:pr_mes_ref, 'mm/yyyy') AND TO_DATE (:pr_mes_ref2, 'mm/yyyy')
Pode ser substituída por :
TO_CHAR (a.mes_ref, 'yyyymm') BETWEEN :pr_mes_ref AND :pr_mes_ref2
O fato de estar usando índice não quer dizer que terá uma boa performance…
Meu conselho é que você faça a sua consulta por partes, inserindo as condições (cláusula where) com mais critério…
[/code]28 de agosto de 2006 às 10:37 pm #76332AnônimoOk Márcio….vou fazer tudo que vc sugeriu sim.
Nossa nem sei como lhe agradecer…muito obrigada!!!
-
AutorPosts
- Você deve fazer login para responder a este tópico.