Comunidade, atualmente faço a seguinte operação via o SQL abaixo (executado
dinamicamente):
sql_aux = 'INSERT INTO "DTF_TENSAO_BARRAS"
(id_barra,"data_hora",valor,id_tipo_dia)
SELECT DISTINCT A.ID, B.BH_DTHR, B.VALOR,' ||
cast(idtipodia as varchar) || ' FROM PAS_R A, BHPAS_H_' ||
replace(CAST(data AS character varying(300)), '-','_')
|| ' B WHERE A.BH_CHAVE=B.BH_CHAVE
AND B.BH_DTHR > ''' || CAST(data AS character
varying(300)) || ' ' || hora_maxima_do_dia || ''' AND B.BH_DTHR < ''' ||
CAST(data AS character varying(300)) || ' 23:59:59''
AND B.BH_CHAVE IN (SELECT BH_CHAVE FROM PAS_R WHERE ID
= ''' || record_ids_barras.id_barra || ''' );';
EXECUTE sql_aux;
A questão é que a tabela BHPAS_YYYY_MM_DD apresenta às vezes mais de 06 milhões
de registros
(com a cláusula DISTINCT; sem essa cláusula o numero de registros triplica (3x)
devido ao um erro estranho na aplicação
que alimenta o banco; a tabela BHPAS_YYYY_MM_DD não possui chave primária - não
fui eu quem criou o banco e nem posso alterar)
e esses mesmos 06 milhões ainda serão passados pelo WHERE da consulta
resultando em média + ou - 6000 registros pra
serem copiados para tabela "DTF_TENSAO_BARRAS", a qual não está vazia.
Da maneira que estou fazendo hoje, a consulta está demorando quase 10 segundos
(para as tabelas que têm + 06 milhões)
e isso apenas pra um dia. Quando roda a consulta mensal, isso pode levar até
mais de 5 minutos,
uma vez que como a consulta é dinâmica e o plano de execução não é reutilizado.
(SOCORRO!!!!!!!!!!! ahauahauahuhuahu).
PERGUNTA: Tem como otimizar essa consulta de alguma maneira? Dá pra usar o COPY
nesse caso?
PostgreSQL 8.2.4 - S.O. CentOS 4.5
Eis as tabelas (e índices) envolvidos nessa consulta:
CREATE TABLE bhpas_h_2009_01_29
(
bh_dthr timestamp with time zone,
bh_chave integer,
bh_variacao integer,
flag integer,
flagest smallint,
linfa real,
linfe real,
linfu real,
lsupa real,
lsupe real,
lsupu real,
resnorm real,
rgalr smallint,
valest real,
valor real
)
WITH (OIDS=FALSE)
TABLESPACE sagebhtab;
ALTER TABLE bhpas_h_2009_01_29 OWNER TO sage;
CREATE INDEX pas_h_2009_01_29_a_i
ON bhpas_h_2009_01_29
USING btree
(bh_chave, bh_dthr)
TABLESPACE sagebhind;
CREATE TABLE pas_r
(
bh_dthr_ini timestamp with time zone,
bh_dthr_fim timestamp with time zone,
bh_sinonimo integer,
bh_chave integer,
bh_indtr integer,
eqp character(18),
estacao character(12),
histper smallint,
id character(24),
nome character(42),
tac character(12),
tipoe smallint,
tpeqp smallint
)
WITH (OIDS=FALSE)
TABLESPACE sagebhref;
ALTER TABLE pas_r OWNER TO sage;
CREATE UNIQUE INDEX pas_r_a_i
ON pas_r
USING btree
(bh_chave, bh_dthr_ini, bh_dthr_fim)
TABLESPACE sagebhind;
CREATE INDEX pas_r_b_i
ON pas_r
USING btree
(id)
TABLESPACE sagebhind;
CREATE TABLE "DTF_TENSAO_BARRAS"
(
id_barra character varying(20) NOT NULL,
data_hora timestamp without time zone NOT NULL,
valor real,
status_carga_1 character varying(10), -- Pode receber 02 valores:...
status_carga_2 character varying(10), -- Pode receber 04 valores:...
id_tipo_dia integer,
id_tipo_carga integer,
CONSTRAINT "pk-dtf-tensao-barras" PRIMARY KEY (id_barra, data_hora),
CONSTRAINT "fk-dtf-tensao-barras" FOREIGN KEY (id_barra)
REFERENCES "DTF_IDS_BARRAS" (id_barra) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE INDEX "indice1-dtf-tensao-barras"
ON "DTF_TENSAO_BARRAS"
USING btree
(id_barra, data_hora);
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral