Tuning SQL

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
fabiopdb
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Qua, 22 Ago 2007 4:58 pm
Localização: rio de janeiro

Amigos estou com um problema nessa consulta será alguém (iluminado) pode me ajudar pois esta consulta esta demorando 7hs !!!!
Se alguém tiver alguma ideia eu agradeço muito.

CREATE OR REPLACE VIEW VENDAS_INDIRETAS AS
SELECT /*+rule*/ cod_classe_extra,
ds_classe_extra,
cod_extra,
desc_ex,
COUNT(qtd_servico) qtd_servico,
SUM(VALOR) VALOR,
REFERENCIA,
GRUPO_INDIRETAS

FROM (
--Venda de Serviços Financiados
SELECT /*+rule*/tcex.COD_CLASSE_EXTRA,
tcex.DS_CLASSE_EXTRA,
tex.COD_EXTRA,
tex.DESC_EX,
COUNT(vpc.ident_parc) qtd_servico,
SUM(vpc.TOTALDIV) VALOR,
to_date('01' || '/' || TO_CHAR(vpc.dt_parcelamento, 'mm/yyyy'), 'dd/mm/yyyy') REFERENCIA,

(case
when tcex.cod_classe_extra in (1,2,3,8,9,10,14) then
'AGUA'
when tcex.cod_classe_extra in (4,5) then
'ESGOTO'
end) GRUPO_INDIRETAS


FROM TAB_EXTRA tex, VEW_DS_PARCELAMENTO vpc, TAB_CLASSE_EXTRA tcex
WHERE tex.COD_EXTRA = vpc.COD_EXTRA
AND tex.COD_CLASSE_EXTRA = tcex.COD_CLASSE_EXTRA
AND vpc.DT_CANCELADO IS NULL
AND vpc.cod_tipo_parc = 2
GROUP BY tcex.COD_CLASSE_EXTRA,
tcex.DS_CLASSE_EXTRA,
tex.COD_EXTRA,
tex.DESC_EX,
vpc.dt_parcelamento

UNION

--Venda de Serviços - NFA pagamento a vista
select /*+rule*/tc.cod_classe_extra,
tc.ds_classe_extra,
v.cod_extra,
te.desc_ex,
count(v.ident_extra) qtd_servico,
sum(v.valor) VALOR,
-- to_char(v.data_ref, 'dd/mm/yyyy') REFERENCIA,
v.data_ref REFERENCIA,

(case
when tc.cod_classe_extra in (1,2,3,8,9,10,14) then
'AGUA'
when tc.cod_classe_extra in (4,5) then
'ESGOTO'
end) GRUPO_INDIRETAS

from vew_ds_faturamento_detalhado v,
tab_extra te,
tab_classe_extra tc
where te.cod_extra = v.cod_extra
and tc.cod_classe_extra = te.cod_classe_extra(+)
and v.in_original = 1
and v.ident_conta is not null
and v.cod_tipo_nf = 2
group by tc.cod_classe_extra,
tc.ds_classe_extra,
v.cod_extra,
te.desc_ex,
v.data_ref)


WHERE cod_classe_extra not in (6, 7, 11, 12, 13, 15, 16, 17, 19, 20)
GROUP BY cod_classe_extra, ds_classe_extra, cod_extra, desc_ex,REFERENCIA, GRUPO_INDIRETAS
ORDER BY DS_CLASSE_EXTRA, DESC_EX
LoadingXp
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 65
Registrado em: Sex, 30 Mar 2007 11:57 am
Localização: SP
Contato:
Att.

Luciano Alvarenga M. Pires
DBA ORACLE CERTIFICADO
http://fulloracle.blogspot.com
------------------------------------
Dinheiro é o combustivel da sociedade industrial. Mas na sociedade da informática o combustivel, o poder, é o conhecimento.

Amigo,

Tira o ORDER BY criar uma temporária, depois faz o select e coloca o order na consulta.

O proximo passo é tentar quebrar a consulta em 2 ou 3 passos.

depois que você fizer tudo isso acima vai ajustando cada uma das consultas com index, tudo isso com a ajuda do EXECUTE EXPLAIN.

Se está dando table scan internos e os registros são muitos, seria interessante você colocar indice.

Depois que você fizer isso manda o tempo que ficou e a consulta tambem. Abraços!!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes