Experimenta tirar o Date_Part...
Já tive problemas com essa função de data que deixava queryes minhas
lentas... 

Em Sex, 2006-09-01 às 14:48 +0000, Luiz Fernando Amaral escreveu:
>                              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

_______________________________________________
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