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, num_ped_compra INTEGER, numero_nf INTEGER, modelo_nf CHAR(2), serie_nf CHAR(3), forma_pagto VARCHAR(200), data_autorizacao TIMESTAMP WITHOUT TIME ZONE, id_autorizador INTEGER, data_ped_compra TIMESTAMP WITHOUT TIME ZONE, id_comprador INTEGER, data_emissao TIMESTAMP WITHOUT TIME ZONE, data_receber TIMESTAMP WITHOUT TIME ZONE, data_saida TIMESTAMP WITHOUT TIME ZONE, vendedor VARCHAR(100), data_recebido TIMESTAMP WITHOUT TIME ZONE, data_conf_entrada TIMESTAMP WITHOUT TIME ZONE, id_func_conferiu INTEGER, observ_conferente VARCHAR(1000), data_lancto TIMESTAMP WITHOUT TIME ZONE, valor_produtos NUMERIC(18,2) NOT NULL, valor_total_frete NUMERIC(18,2) NOT NULL, valor_total_seguro NUMERIC(18,2) NOT NULL, valor_total_outros NUMERIC(18,2) NOT NULL, valor_desconto NUMERIC(18,2) NOT NULL, valor_icms NUMERIC(18,2) NOT NULL, valor_ipi NUMERIC(18,2) NOT NULL, valor_st NUMERIC(18,2) NOT NULL, valor_total NUMERIC(18,2) NOT NULL, valor_pis NUMERIC(18,2) NOT NULL, valor_cofins NUMERIC(18,2) NOT NULL, valor_bc_icms NUMERIC(18,2) NOT NULL, valor_bc_st NUMERIC(18,2) NOT NULL, resp_frete CHAR(1) NOT NULL, id_transportadora INTEGER, peso_liquido NUMERIC(12,3) NOT NULL, peso_bruto NUMERIC(12,3) NOT NULL, volumes VARCHAR(20), observacoes VARCHAR(1000), status CHAR(1) NOT NULL, placa VARCHAR(8), motorista VARCHAR(30), uf_placa CHAR(2), valor_icms_recuperar NUMERIC(18,2) NOT NULL, valor_ipi_recuperar NUMERIC(18,2) NOT NULL, valor_pis_recuperar NUMERIC(18,2) NOT NULL, valor_cofins_recuperar NUMERIC(18,2) NOT NULL, fora_estado BOOLEAN NOT NULL, id_romaneio_devolucao BIGINT, id_venda_devolucao BIGINT, observacoes_nf TEXT, id_func_fechamento INTEGER, data_fechamento TIMESTAMP WITHOUT TIME ZONE, id_func_status_pedido INTEGER, data_status_pedido TIMESTAMP WITHOUT TIME ZONE, valor_creditos_baixados NUMERIC(18,2) NOT NULL, valor_dev_a_vista NUMERIC(18,2) NOT NULL, tem_nf BOOLEAN DEFAULT false NOT NULL, id_nat_operacao INTEGER NOT NULL, frete_a_parte BOOLEAN DEFAULT false NOT NULL, seguro_a_parte BOOLEAN DEFAULT false NOT NULL, despesas_a_parte BOOLEAN DEFAULT false NOT NULL, tipo_convenio BOOLEAN NOT NULL, especie_nf CHAR(2), ct_id_compra_vinculada BIGINT, valor_cofins_rec_frete NUMERIC(18,2) NOT NULL, valor_pis_rec_frete NUMERIC(18,2) NOT NULL, valor_icms_rec_frete NUMERIC(18,2) NOT NULL, historico VARCHAR(150), id_contrato BIGINT, id_motivo_devolucao INTEGER, valor_subst_trib_recuperar NUMERIC(18,2) NOT NULL, valor_total_digitado NUMERIC(18,2), valor_total_frete_digitado NUMERIC(18,2), valor_total_seguro_digitado NUMERIC(18,2), valor_total_outros_digitado NUMERIC(18,2), forma_rateio_itens CHAR(1), valor_ipi_extra NUMERIC(18,2) NOT NULL, valor_iss NUMERIC(18,2) NOT NULL, iss_retido BOOLEAN NOT NULL, rntrc VARCHAR(20), placa_reboque1 VARCHAR(8), uf_placa_reboque1 CHAR(2), rntrc_reboque1 VARCHAR(20), placa_reboque2 VARCHAR(8), uf_placa_reboque2 CHAR(2), rntrc_reboque2 VARCHAR(20), placa_reboque3 VARCHAR(8), uf_placa_reboque3 CHAR(2), rntrc_reboque3 VARCHAR(20), id_veiculo INTEGER, danfe VARCHAR(60), valor_total_scp NUMERIC(18,2) NOT NULL, valor_total_scp_baixado NUMERIC(18,2) NOT NULL, texto_pendencias TEXT, compra_liberada BOOLEAN NOT NULL, valor_parcelado NUMERIC(18,2) NOT NULL, valor_dev_a_prazo NUMERIC(18,2) NOT NULL, valor_dev_abatimento NUMERIC(18,2) NOT NULL, data_indexador DATE, orcado_com_imposto BOOLEAN NOT NULL, valor_bc_pis NUMERIC(18,2) NOT NULL, valor_bc_cofins NUMERIC(18,2) NOT NULL, ct_tipo_frete_contratado CHAR(1), nfe_validada BOOLEAN NOT NULL, nfe_msg_consulta VARCHAR(200), xml_nfe TEXT, CONSTRAINT compras_pkey PRIMARY KEY(id), CONSTRAINT compras_fk1 FOREIGN KEY (id_empresa) REFERENCES public.empresas(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk10 FOREIGN KEY (id_romaneio_devolucao) REFERENCES public.romaneios(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk11 FOREIGN KEY (id_contrato) REFERENCES public.contratos_compra(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk12 FOREIGN KEY (id_func_fechamento) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk13 FOREIGN KEY (id_nat_operacao) REFERENCES public.naturezas_operacoes(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk14 FOREIGN KEY (id_motivo_devolucao) REFERENCES public.motivos_devolucao(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk15 FOREIGN KEY (id_veiculo) REFERENCES public.veiculos_transporte(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk2 FOREIGN KEY (id_terceiro) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk3 FOREIGN KEY (ct_id_compra_vinculada) REFERENCES public.compras(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk4 FOREIGN KEY (id_autorizador) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk5 FOREIGN KEY (id_comprador) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk6 FOREIGN KEY (id_func_conferiu) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk7 FOREIGN KEY (id_transportadora) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk8 FOREIGN KEY (id_func_status_pedido) REFERENCES public.terceiros(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE, CONSTRAINT compras_fk9 FOREIGN KEY (id_venda_devolucao) REFERENCES public.vendas(id) ON DELETE RESTRICT ON UPDATE CASCADE NOT DEFERRABLE ) WITHOUT OIDS; 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); CREATE INDEX compras_idx12 ON public.compras USING btree (id_contrato); CREATE INDEX compras_idx13 ON public.compras USING btree (id_empresa, data_recebido); CREATE INDEX compras_idx14 ON public.compras USING btree (id_empresa, numero_nf); CREATE INDEX compras_idx2 ON public.compras USING btree (id_empresa, id_terceiro); CREATE UNIQUE INDEX compras_idx3 ON public.compras USING btree (id_empresa, num_ped_compra_interno); CREATE INDEX compras_idx4 ON public.compras USING btree (id_empresa, data_emissao); CREATE INDEX compras_idx5 ON public.compras USING btree (id_empresa, data_recebido DESC); CREATE INDEX compras_idx6 ON public.compras USING btree (id_empresa, data_receber); CREATE INDEX compras_idx7 ON public.compras USING btree (id_empresa, data_lancto); CREATE INDEX compras_idx8 ON public.compras USING btree (id_venda_devolucao); CREATE INDEX compras_idx9 ON public.compras USING btree (id_romaneio_devolucao); 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 nome_fantasia, nop1.desc_natureza, CASE nfe.id_compra IS NOT NULL WHEN true THEN c.valor_total ELSE v.valor_total END AS valor_total, nfe.data_emissao, CASE nfe.id_compra IS NOT NULL WHEN true THEN 'Entrada'::text ELSE 'Saída'::text END AS desc_ent_saida, CASE nfe.status_retorno WHEN '0'::bpchar THEN 'Não consultada'::text WHEN '1'::bpchar THEN 'OK'::text WHEN '2'::bpchar THEN 'Rejeitada'::text WHEN '3'::bpchar THEN 'Denegada'::text WHEN '4'::bpchar THEN 'Erro'::text ELSE NULL::text END AS desc_status_retorno, nfe.mensagem_status, nfe.codigo_retorno, t2.razao_social AS nome_func_emissao, t3.razao_social AS nome_func_cancelamento, v.id_romaneio AS venda_id_romaneio, c.id_romaneio_devolucao AS compra_id_romaneio, r1.numero_doc AS venda_num_doc_romaneio, r2.numero_doc AS compra_num_doc_romaneio, COALESCE(v.venda_posterior, false) AS venda_posterior, r1.data_acerto AS venda_data_acerto_rom, r2.data_acerto AS compra_data_acerto_rom, nfe.protocolo_cancelamento, nfe.dh_envio_email_canc, nfe.nao_enviar_email_canc, CASE nfe.dh_cancelamento IS NOT NULL AND (nfe.dh_envio_email IS NOT NULL OR nfe.nao_enviar_email) WHEN true THEN 'Cancelamento'::text ELSE 'Emissão'::text END AS tipo_email, nfe.id_contingencia, ctg.tipo_contingencia, CASE COALESCE(ctg.tipo_contingencia, ''::bpchar) WHEN '1'::bpchar THEN 'FS'::text WHEN '2'::bpchar THEN 'SCAN'::text ELSE 'Normal'::text END AS tipo_emissao FROM nfe LEFT JOIN compras c ON c.id = nfe.id_compra LEFT JOIN vendas v ON v.id = nfe.id_venda LEFT JOIN terceiros t1 ON nfe.id_terceiro = t1.id LEFT JOIN naturezas_operacoes nop1 ON nfe.id_nat_operacao = nop1.id JOIN nfe_filas f ON f.id = nfe.id_fila LEFT JOIN terceiros t2 ON t2.id = nfe.id_func_emissao LEFT JOIN terceiros t3 ON t3.id = nfe.id_func_cancelamento LEFT JOIN romaneios r1 ON r1.id = v.id_romaneio LEFT JOIN romaneios r2 ON r2.id = c.id_romaneio_devolucao LEFT JOIN nfe_contingencia ctg ON ctg.id = nfe.id_contingencia; 3) a consulta 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 >________________________________ > De: Flavio Henrique Araque Gurgel <[email protected]> >Para: Comunidade Postgresql <[email protected]> >Enviadas: Quarta-feira, 12 de Setembro de 2012 13:12 >Assunto: Re: [pgbr-geral] Interpretar explain > > >Em 12/09/2012 às 12:09 horas, [email protected] >escreveu: >Pessoal, estou tendo o explain abaixo para uma view. O que não entendo é por >que o pg não está usando a chave primeira para fazer um join com a tabela de >compras (Seq Scan on compras c (cost=0.00..5125.69 rows=79569 width=26)). >Alguém pode me orientar? >> >Certamente poderemos se você nos enviar: >1) a consulta >2) a estrutura das tabelas envolvidas (pelo menos a que você está com a dúvida) > >[]s > >__________________________________ Flavio Henrique A. Gurgel Líder de Projetos Especiais Consultoria, Projetos & Treinamentos 4LINUX Tel1: +55-11.2125-4747 ou 2125-4748 www.4linux.com.br email: [email protected] ______________________________ FREE SOFTWARE SOLUTIONS > > >_______________________________________________ >pgbr-geral mailing list >[email protected] >https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > > _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
