Em 12 de setembro de 2012 14:10, Jean Domingues
<ejdom...@yahoo.com.br> escreveu:
> Tá certo. Não passei por achar que era muita informação. Vamos lá:
>
> 1) a Tabela compras (a exemplo)
>
> CREATE TABLE public.compras (
>   id BIGINT NOT NULL,
>   id_empresa INTEGER NOT NULL,
>   id_terceiro INTEGER NOT NULL,
>   num_ped_compra_interno INTEGER NOT NULL,
...
<corte>
...
> CREATE INDEX compras_idx1 ON public.compras
>
>   USING btree (id_empresa, data_ped_compra);
>
> CREATE INDEX compras_idx10 ON public.compras
>   USING btree (ct_id_compra_vinculada);
...
<corte>
...

> 2) a View
> CREATE VIEW public.view_fila_nfe (
>     id,
>     ...
>     tipo_emissao)
>
> AS
> SELECT nfe.id, nfe.id_fila, f.desc_fila, nfe.id_compra, nfe.id_venda,
>     sp_formata_danfe(nfe.danfe) AS danfe, nfe.recibo, nfe.protocolo, 
> nfe.xml_nao_assinado, nfe.xml_assinado, nfe.dh_fila, nfe.dh_envio, 
> nfe.dh_retorno, nfe.dh_cancelamento, nfe.dh_impressao, nfe.numero_chave, 
> nfe.dv_chave, nfe.status_envio, nfe.status_retorno, nfe.email, 
> nfe.dh_envio_email, nfe.nao_enviar_email, nfe.erro_email, nfe.numero_nf, 
> nfe.id_empresa, nfe.serie_nf,
>         CASE nfe.id_compra IS NOT NULL
>             WHEN true THEN c.num_ped_compra_interno
>             ELSE v.numero_doc
>         END AS numero_doc, nfe.id_terceiro, t1.razao_social, t1.nome AS
...
<corte>
...
>
> explain
> select * from view_fila_nfe where (id_empresa = 1) and
> (id_fila = 1) and (status_retorno = '1') and
> (coalesce(email, '') <> '') AND (((dh_cancelamento IS NULL) AND 
> (dh_envio_email IS NULL)
> AND (nao_enviar_email = false))  or ((dh_cancelamento IS NOT NULL)
> AND (dh_envio_email_canc IS NULL) AND (nao_enviar_email_canc = false))) order 
> by numero_nf, id

Cara isso que você passou é muita coisa mas ainda diz pouco sobre seu modelo.

Bom vou tentar te ajudar:

1) Com o Dutra falou, sua tabela tem muita coisa, cabe uma normalização.
2) Ter índice não significa que o planejador irá usá-lo.
3) Vou dar um chute apenas: na linha 24 do explain que vocẽ enviou
informa o custo de busca do seq_scan em compras (cost=0.00..5125.69
rows=79569), a única referência para compras é n left join na view.
Minha opnião é que por esses dois motivos (custo baixo e left join) o
planejador ignora o índice. Não sei a lógica do negócio, mas creio que
se você trocar o left join por inner join com a tabela compras, creio
que o planejador utilizará o índice. E certamente utilizará se
compras.id fizer parte de uma filtro.
4) Uma pergunta: Sua consulta está lenta? (estou partindo do princípio
que sim) Quanto tempo está demorando? O fato de não usar esse índice
especificamente não quer dizer que seja o motivo dessa lentidão.

-- 
Marcone Peres - DBA
http://www.linkedin.com/in/marconeperes
@marconeperes
(61) 8146-0028
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a