Skip site navigation (1) Skip section navigation (2)

Consulta: Data WareHouse y Otros

From: Crell - Marcelo España Koock <mespana(at)crell(dot)cl>
To: "'Alvaro Herrera'" <alvherre(at)dcc(dot)uchile(dot)cl>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Consulta: Data WareHouse y Otros
Date: 2004-06-29 13:27:16
Message-ID: 003501c45ddc$cbb065a0$08074db1@mespana (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Tengo la siguiente situación:

Hace cuatro meses estoy con un sistema en producción, que es el motor de
facturación de servicios de la empresa donde trabajo. Funciona bien y no
hemos tenido problemas asociados a Postgres como software, sin embargo si
tengo los siguientes problemas:

- Tengo ciertas consultas que demoran demasiado (sobre un universo de 6.000
registros, 15 seg aprox.). He intentado cambiar la forma de consultas, he
modificado valores en el .conf de postgres y no hay cambios relevantes

- De los resultados se obtiene estadísticas via intranet sobre los datos en
línea e históricos. Igualmente hay un tiempo de espera.

Los tiempos de espera no son críticos hoy, pero la información crece de
forma importante mes a mes y me interesaría saber si existe una forma de
mejorar trascendentalmente los tiempos.

¿Puedo implementar un Data WareHouse para las estadísticas sobre Postgresql?
¿Hay alguna configuración o forma de implementación que me haya saltado?
¿Hay alguna configuración que deba ajustar en el ODBC para Postgres 7.4?


Gracias,

Server
Dual Xeon 3.06 Ghz
1 Gb RAM
36 Gb SCSI
RedHat 8.0 (shmmax, shmall - > modificados)
PostgresQl 7.4 con valores ajustados a la memoria RAM disponible

Ejemplo:
La siguiente consulta demora 23 seg, devuelve 14.000 aprox y básicamente
consulta sobre si misma para obtener valores anteriores. Se utiliza para
presentar en la boleta de servicios el encabezado del documento con valores
"Consumo Anterior" + "Consumo Actual". Muestra todos los documentos emitidos
a la fecha y está como una vista. Cuando alguien desea emitir una boleta se
consulta sobre la vista parametrizando por el número de documento necesario
(puede ser un rango).

SELECT DISTINCT encdoc.ndoc_encdoc, encdoc.codigo_documento,
encdoc.femi_encdoc, encdoc.fven_encdoc, contratos.tfase_contrato,
tarifas.sigla_tarifa, empalmes.codigo_empalme, empalmes.loca_empalme,
ciudades.nombre_ciudad, sectores.codigo_sector, zonas.nomlargo_zona,
detcnx.serie_medidor, medidores.marca_medidor, medidores.tipo_medidor,
clientes.rut_cliente, clientes.dv_cliente,
(((btrim(clientes.nombre_cliente::text, ' '::text) || ' '::text) ||
btrim(clientes.apepat_cliente::text, ' '::text)) || ' '::text) ||
btrim(clientes.apemat::text, ' '::text) AS cliente,
(((((((btrim(ubica10.nombre_ubica10::text, ' '::text) || ' '::text) ||
btrim(empalmes.nubiinm_empalme::text, ' '::text)) || ' '::text) ||
btrim(empalmes.callenro_empalme::text, ' '::text)) || ' '::text) ||
btrim(ciudades.nombre_ciudad::text, ' '::text)) || ', '::text) ||
btrim(empalmes.loca_empalme::text, ' '::text) AS domicilio,
btrim(contratos.desdom_contrato::text, ' '::text) AS despacho,
tarcnt.potencia_tarcnt, tarcnt.constante_tarcnt,
medidores.constante_medidor, anterior.eactiva_lectura AS eactiva_anterior,
anterior.fecha_lectura AS fecha_anterior, actual.cceactiva_lectura,
actual.eactiva_lectura AS eactiva_actual, actual.fecha_lectura AS
fecha_actual, actual.ppunta_lectura, actual.pppunta_lectura,
actual.pfpunta_lectura
   FROM encdoc, contratos, tarcnt, tarifas, empalmes, ciudades, sectores,
zonas, detcnx, medidores, clientes, ubica10, ( SELECT
lect2_bol.serie_medidor, lect2_bol.ndoc_encdoc, lect2_bol.codigo_documento,
lecturas.eactiva_lectura, lecturas.fecha_lectura, lecturas.ppunta_lectura,
lecturas.pppunta_lectura, lecturas.pfpunta_lectura,
lecturas.cceactiva_lectura
           FROM lecturas
      JOIN ( SELECT lect.serie_medidor, lect.ndoc_encdoc,
lect.codigo_documento, max(lect.fecha_lectura) AS fecha_lectura
                   FROM ( SELECT encdoc.ndoc_encdoc,
encdoc.codigo_documento, lecturas.serie_medidor, lecturas.fecha_lectura
                           FROM lecturas, encdoc
                      JOIN detcnx ON encdoc.codigo_contrato =
detcnx.codigo_contrato
                     WHERE lecturas.serie_medidor = detcnx.serie_medidor AND
lecturas.fecha_lectura <= encdoc.fproceso_encdoc AND
(lecturas.cregistro_lectura = 2::numeric OR lecturas.cregistro_lectura =
1::numeric)) lect
                  GROUP BY lect.serie_medidor, lect.ndoc_encdoc,
lect.codigo_documento
                 HAVING lect.codigo_documento <> '0000000002'::bpchar)
lect2_bol ON lect2_bol.fecha_lectura = lecturas.fecha_lectura AND
lecturas.serie_medidor = lect2_bol.serie_medidor
     WHERE lecturas.cregistro_lectura = 2::numeric OR
lecturas.cregistro_lectura = 1::numeric) actual, ( SELECT
encdoc.ndoc_encdoc, encdoc.codigo_documento, blect5.fecha_lectura,
blect5.eactiva_lectura
           FROM encdoc
      LEFT JOIN ( SELECT blect2.codigo_documento, blect2.ndoc_encdoc,
lecturas.fecha_lectura, lecturas.eactiva_lectura
                   FROM ( SELECT blect3.ndoc_encdoc,
blect3.codigo_documento, blect3.serie_medidor, max(blect3.fecha_lectura) AS
fecha_lectura
                           FROM ( SELECT blect.ndoc_encdoc,
blect.codigo_documento, blect.serie_medidor, blect.fecha_lectura
                                   FROM ( SELECT blect.serie_medidor,
blect.ndoc_encdoc, blect.codigo_documento, max(blect.fecha_lectura) AS
fecha_lectura
                                           FROM ( SELECT encdoc.ndoc_encdoc,
encdoc.codigo_documento, lecturas.serie_medidor, lecturas.fecha_lectura
                                                   FROM lecturas, encdoc
                                              JOIN detcnx ON
encdoc.codigo_contrato = detcnx.codigo_contrato
                                             WHERE encdoc.codigo_documento =
'0000000001'::bpchar AND lecturas.serie_medidor = detcnx.serie_medidor AND
lecturas.fecha_lectura <= encdoc.fproceso_encdoc AND
(lecturas.cregistro_lectura = 2::numeric OR lecturas.cregistro_lectura =
1::numeric)) blect
                                          GROUP BY blect.serie_medidor,
blect.ndoc_encdoc, blect.codigo_documento) blect1
                              JOIN ( SELECT encdoc.ndoc_encdoc,
encdoc.codigo_documento, lecturas.serie_medidor, lecturas.fecha_lectura
                                           FROM lecturas, encdoc
                                      JOIN detcnx ON encdoc.codigo_contrato
= detcnx.codigo_contrato
                                     WHERE encdoc.codigo_documento =
'0000000001'::bpchar AND lecturas.serie_medidor = detcnx.serie_medidor AND
lecturas.fecha_lectura <= encdoc.fproceso_encdoc AND
(lecturas.cregistro_lectura = 2::numeric OR lecturas.cregistro_lectura =
1::numeric)) blect ON blect1.ndoc_encdoc = blect.ndoc_encdoc AND
blect1.serie_medidor = blect.serie_medidor
                             WHERE blect.fecha_lectura <>
blect1.fecha_lectura) blect3
                          GROUP BY blect3.ndoc_encdoc,
blect3.codigo_documento, blect3.serie_medidor) blect2
              JOIN lecturas ON blect2.fecha_lectura = lecturas.fecha_lectura
AND blect2.serie_medidor = lecturas.serie_medidor
             WHERE lecturas.cregistro_lectura = 2::numeric OR
lecturas.cregistro_lectura = 1::numeric) blect5 ON encdoc.codigo_documento =
blect5.codigo_documento AND encdoc.ndoc_encdoc = blect5.ndoc_encdoc
     WHERE encdoc.codigo_documento = '0000000001'::bpchar) anterior
  WHERE encdoc.ndoc_encdoc = actual.ndoc_encdoc AND encdoc.codigo_documento
= actual.codigo_documento AND encdoc.ndoc_encdoc = anterior.ndoc_encdoc AND
encdoc.codigo_documento = anterior.codigo_documento AND detcnx.serie_medidor
= medidores.serie_medidor AND encdoc.codigo_contrato =
contratos.codigo_contrato AND encdoc.codigo_contrato =
tarcnt.codigo_contrato AND encdoc.codigo_contrato = detcnx.codigo_contrato
AND tarcnt.codigo_tarifa = tarifas.codigo_tarifa AND
contratos.codigo_empalme = empalmes.codigo_empalme AND
empalmes.codigo_ciudad = ciudades.codigo_ciudad AND empalmes.codigo_sector =
sectores.codigo_sector AND empalmes.codigo_zona = zonas.codigo_zona AND
empalmes.codigo_ubica10 = ubica10.codigo_ubica10 AND encdoc.codigo_clifac =
clientes.codigo_cliente
  ORDER BY encdoc.ndoc_encdoc


-----Mensaje original-----
De: pgsql-es-ayuda-owner(at)postgresql(dot)org
[mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Alvaro Herrera
Enviado el: Jueves, 10 de Junio de 2004 16:11
Para: Mario Soto
CC: alejandro(dot)casanova(at)telintel(dot)net; pgsql-es-ayuda(at)postgresql(dot)org
Asunto: Re: [pgsql-es-ayuda] tuning

On Thu, Jun 10, 2004 at 02:01:48PM -0400, Mario Soto wrote:
> Yo he hecho ingresos masivos de mas de 4 millones de registros en forma
> transaccional y lo he dejado corriendo en las noches, debido al exceso de
> escritura de disco, ya que la performance se degrada mucho ... y me ha
> funcionado bien.

El rendimiento puede ser mucho mejor si incrementas checkpoint_segments
en una cantidad considerable (digamos dejarlo en 50).  Y sort_mem
tambien (esto ultimo solo mientras dura la creacion de indices)

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"On the other flipper, one wrong move and we're Fatal Exceptions"
(T.U.X.: Term Unit X  - http://www.thelinuxreview.com/TUX/)


---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze es tu amigo


In response to

  • Re: tuning at 2004-06-10 20:11:05 from Alvaro Herrera

Responses

pgsql-es-ayuda by date

Next:From: Alvaro HerreraDate: 2004-06-29 13:35:29
Subject: Re: Lista de codigo de errores de postgresql en
Previous:From: tgutierrezDate: 2004-06-29 13:17:42
Subject: Re: Lista de codigo de errores de postgresql en

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group