PUBLICIDADE
Colegas estou convertendo algumas queries do banco anywhere 5
(dialeto watcom) para o postgresql 8 (pl/pgsql), porém tudo ocorria
bem e o postgresql com uma performance melhor que o anywhere, até
aparecer as subconsultas. Se alguém souber algum site , documentos
que possam ajudar neste tópico ficaria muito agradecido. Abaixo está
query escrita , convertida para o postgresql 8 com seu plano de
acesso e outras informçãoes pertinentes , sendo que no anywhere
levou 'x' tempo e no postgree '2x' mais que o dobro... qualquer
sugestão será bem vinda para otimização da mesma.

Obrigado

SELECT cp.i_contas_plano,
cp.descricao,
cp.grau_conta,
cp.tipo_conta,
( SELECT case when sum(lanc.valor_lancto) is null then 0
else sum(lanc.valor_lancto) end
FROM lanctos_plano_contas lanc , contas_plano cont
WHERE cont.i_entidades =
p.i_entidades and
cont.i_contas_plano =
lanc.i_contas_plano and
cont.i_plano_contas =
lanc.i_plano_contas and
cont.i_entidades =
lanc.i_entidades and
cont.ano_exerc =
lanc.ano_exerc and
date_part('month',lanc.data_lancto) >= 7
AND
date_part('month',lanc.data_lancto) <= 7
AND
(case when lanc.lanc_inicial is null then 'E' else
lanc.lanc_inicial end) <> '*' and
lanc.tipo_lancto
= 'C'
AND
lanc.i_plano_contas
= '2'
AND
lanc.i_entidades = e.i_entidades
AND
pl.ano_exerc = 2006 and
lanc.ano_exerc = 2006 ) as totcred
from plano_contas pl,contas_plano cp, entidades e
where ('C' IN ('0', cast(e.i_entidades as varchar(3))) OR
'C' IN ('C',e.administracao)) AND
e.i_entidades = cp.i_entidades AND
(0 = 0 OR cp.grau_conta <= 0) AND
cp.tipo_conta = 'S' AND
cp.i_plano_contas = pl.i_plano_contas and
cp.i_entidades = pl.i_entidades and
cp.ano_exerc = pl.ano_exerc and
('T' = 'T' OR substr(cp.i_contas_plano,1,1) = 'T') AND
pl.i_plano_contas = '2' AND
pl.ano_exerc = 2006
ORDER BY 1



o plano de acesso é :
Sort (cost=259603.56..259603.58 rows=7 width=153)
Sort Key: cp.i_contas_plano
-> Nested Loop (cost=125.25..259603.47 rows=7 width=153)
Join Filter: ("inner".i_entidades = "outer".i_entidades)
-> Nested Loop (cost=0.00..11.66 rows=1 width=10)
-> Index Scan using pk_plano_contas on plano_contas
pl (cost=0.00..5.83 rows=1 width=8)
Index Cond: ((ano_exerc = 2006) AND
(i_plano_contas = 2::smallint))
-> Index Scan using idx_entidades_i_entidades on
entidades e (cost=0.00..5.82 rows=1 width=2)
Index Cond: ("outer".i_entidades = e.i_entidades)
-> Bitmap Heap Scan on contas_plano cp
(cost=125.25..891.49 rows=800 width=153)
Recheck Cond: ((2006 = ano_exerc) AND (2::smallint =
i_plano_contas))
Filter: (tipo_conta = 'S'::bpchar)
-> Bitmap Index Scan on pk_contas_plano
(cost=0.00..125.25 rows=7042 width=0)
Index Cond: ((2006 = ano_exerc) AND (2::smallint
= i_plano_contas))
SubPlan
-> Aggregate (cost=36955.75..36955.76 rows=1 width=11)
-> Result (cost=36913.30..36954.13 rows=323
width=11)
One-Time Filter: ($2 = 2006)
-> Merge Join (cost=36913.30..36954.13
rows=323 width=11)
Merge Cond: ("outer".i_contas_plano
= "inner".i_contas_plano)
-> Sort (cost=35518.96..35520.18
rows=487 width=53)
Sort Key: lanc.i_contas_plano
-> Bitmap Heap Scan on
lanctos_plano_contas lanc (cost=2282.30..35497.22 rows=487 width=53)
Recheck Cond: ((ano_exerc =
2006) AND (i_entidades = $1) AND (i_entidades = $0))
Filter: ((date_part
('month'::text, (data_lancto)::timestamp without time zone) >=
7::double precision) AND (date_part('month'::text,
(data_lancto)::timestamp without time zone) <= 7::double precision)
AND (CASE WHEN (lanc_inicial IS NULL) THEN 'E'::bpchar ELSE
lanc_inicial END <> '*'::bpchar) AND (tipo_lancto = 'C'::bpchar) AND
(i_plano_contas = 2::smallint))
-> Bitmap Index Scan on
idx_data_lancto_plano_contas (cost=0.00..2282.30 rows=184623
width=0)
Index Cond:
((ano_exerc = 2006) AND (i_entidades = $1) AND (i_entidades = $0))
-> Sort (cost=1394.34..1411.95
rows=7042 width=42)
Sort Key: cont.i_contas_plano
-> Bitmap Heap Scan on
contas_plano cont (cost=160.46..944.30 rows=7042 width=42)
Recheck Cond: ((2006 =
ano_exerc) AND (i_entidades = $0) AND ($1 = i_entidades) AND
(2::smallint = i_plano_contas))
-> Bitmap Index Scan on
pk_contas_plano (cost=0.00..160.46 rows=7042 width=0)
Index Cond: ((2006 =
ano_exerc) AND (i_entidades = $0) AND ($1 = i_entidades) AND
(2::smallint = i_plano_contas))

outras informações:



tabela lanctos_plano_contas 723004 linhas

pk --> i_entidades,ano_exerc, i_lanctos,i_plano_contas
índice --> ano_exerc,i_entidades,data_lancto

tabela contas_plano 24226 linhas

pk --> ano_exerc, i_entidades,i_plano_contas,i_contas_plano

tabela plano_contas 5 linhas
pk --> ano_exerc,i_entidades,i_plano_contas

tabela entidades 1 linha

pk --> i_entidades
índice --> i_entidades


Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu celular. Registre seu aparelho agora!
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a