Agilizar consultas sobre fechas

From: Manuel Alejandro Estevez Fernandez <stvzito(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Agilizar consultas sobre fechas
Date: 2009-10-01 15:34:18
Message-ID: 4AC4CBFA.7080204@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Saludos a todos.

Tengo la siguiente consulta:

select vd.cantidad,vd.precio_venta_unidad_venta,vd.id_esquema_impuesto
from ventas_detalle vd, ventas v, articulos a
where v.id_sucursal=sucursal and
vd.id_sucursal=v.id_sucursal and
vd.id_venta=v.id_venta and
cast(v.fecha as date) = fecha_revision and
vd.id_articulo = a.id_articulo and
a.servicio is null

La estructura de las tablas es la siguiente:

CREATE TABLE ventas
(
id_venta serial NOT NULL,
id_corte_caja bigint NOT NULL,
id_sucursal smallint NOT NULL,
id_concepto smallint NOT NULL,
numero_caja smallint NOT NULL,
folio_venta bigint,
folio_devolucion bigint,
fecha timestamp without time zone NOT NULL,
id_estatus smallint NOT NULL,
devuelto boolean,
sincronizado integer DEFAULT 0,
CONSTRAINT ventas_pkey PRIMARY KEY (id_venta, id_corte_caja,
id_sucursal, numero_caja),
CONSTRAINT ventas_fk_conceptos FOREIGN KEY (id_concepto)
REFERENCES conceptos (id_concepto) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ventas_fk_corte_caja FOREIGN KEY (id_corte_caja,
id_sucursal, numero_caja)
REFERENCES corte_caja (id_corte_caja, id_sucursal, numero_caja)
MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ventas_fk_estatus FOREIGN KEY (id_estatus)
REFERENCES estatus (id_estatus) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITHOUT OIDS;
ALTER TABLE ventas OWNER TO yepas;

-- Index: ventas_id_sucursal_index

-- DROP INDEX ventas_id_sucursal_index;

CREATE INDEX ventas_id_sucursal_index
ON ventas
USING btree
(id_sucursal);

-- Index: ventas_id_venta_index

-- DROP INDEX ventas_id_venta_index;

CREATE INDEX ventas_id_venta_index
ON ventas
USING btree
(id_venta);

CREATE TABLE ventas_detalle
(
id_venta bigint NOT NULL,
id_sucursal smallint NOT NULL,
id_corte_caja bigint NOT NULL,
numero_caja smallint NOT NULL,
id_venta_detalle serial NOT NULL,
id_esquema_impuesto smallint NOT NULL,
id_esquema_oferta smallint NOT NULL,
cantidad numeric(12,3),
precio_venta_unidad_venta numeric(12,3),
tipo_precio text,
precio_regular_unidad_venta numeric(12,3),
precio_chequeo_unidad_venta numeric(12,3),
precio_oferta_unidad_venta numeric(12,3),
kit text,
id_kit smallint,
factor numeric(12,3),
costo_unitario_promedio numeric(12,3),
cantidad_devuelta numeric(12,3),
id_articulo bigint NOT NULL,
CONSTRAINT ventas_detalle_pkey PRIMARY KEY (id_venta, id_sucursal,
id_corte_caja, numero_caja, id_venta_detalle),
CONSTRAINT esquema_ofertas_fk_ofertas FOREIGN KEY (id_esquema_oferta)
REFERENCES esquema_ofertas (id_esquema_oferta) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT venta_detalle_fk_esquema_impuesto FOREIGN KEY
(id_esquema_impuesto)
REFERENCES esquema_impuestos (id_esquema_impuesto) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ventas_detalle_fk_articulos FOREIGN KEY (id_articulo)
REFERENCES articulos (id_articulo) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ventas_detalle_fk_kits FOREIGN KEY (id_kit)
REFERENCES kits (id_kit) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT ventas_detalle_fk_ventas FOREIGN KEY (id_venta,
id_corte_caja, numero_caja, id_sucursal)
REFERENCES ventas (id_venta, id_corte_caja, numero_caja,
id_sucursal) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITHOUT OIDS;
ALTER TABLE ventas_detalle OWNER TO yepas;

-- Index: ix_id_esquema_oferta

-- DROP INDEX ix_id_esquema_oferta;

CREATE INDEX ix_id_esquema_oferta
ON ventas_detalle
USING btree
(id_esquema_oferta);

-- Index: ventas_detalle_id_sucursal_index

-- DROP INDEX ventas_detalle_id_sucursal_index;

CREATE INDEX ventas_detalle_id_sucursal_index
ON ventas_detalle
USING btree
(id_sucursal);

-- Index: ventas_detalle_id_ventas_index

-- DROP INDEX ventas_detalle_id_ventas_index;

CREATE INDEX ventas_detalle_id_ventas_index
ON ventas_detalle
USING btree
(id_venta);

El problema es el tiempo de respuesta de la consulta la tabla ventas
tiene alrededor de 36 millones de registros y la de venta detalle cerca
de 76 millones.Y para una sucursal y un día en específico tarda entre 30
a 40 minutos. ¿Alguna sugerencia o tip para mejorar la consulta?

--
Atentamente.

Manuel Alejandro Estévez Fernández

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Calabaza 2009-10-01 15:51:37 Re: Agilizar consultas sobre fechas
Previous Message Alvaro Herrera 2009-10-01 14:44:31 Re: Notify/listen