Saludos amigos de la lista.

Estoy tratando de optimizar una simple consulta select en mi base de datos
postgresql y de verdad no sé si ya llegué al tope de lo que me ofrece mi
hardware subyacente.

Es una situación bastante simple. A conitnuación muestro una tabla de la
que omito algunas columnas y constraints por simplicidad además que no uso
esas columnas para mi query en estudio.

=> \d+ rmcv

                                        Table "public.rmcv"
               Column                |          Type          | Modifiers |
Storage  | Description
-------------------------------------+------------------------+-----------+----------+-------------
 fecha_snapshot                      | date                   | not null  |
plain    |
 saldo_contable                      | numeric(20,2)          |           |
main     |
 tasa_interes                        | numeric(5,2)           |           |
main     |
 Indexes:
    "rmcv_fecha_snapshot" btree (fecha_snapshot)


La tabla posee 21.029.008 de registros.

La sentencia es:
select saldo_contable, tasa_interes,  tasa_interes * saldo_contable as
multi  from rmcv where fecha_snapshot = '2014-03-17' ;

A continuación el explain analyze

explain (analyze,buffer)

    QUERY PLAN

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using idx_rm_cuentas_vistas_fecha_snapshot on rm_cuentas_vistas
 (cost=0.00..106882.75 rows=976948 width=11) (actual time=0.032..729.346
rows=1043549 loops=1)
   Index Cond: (fecha_snapshot = '2014-03-17'::date)
   Buffers: shared hit=32369
 Total runtime: 782.213 ms

Como pueden ver el tiempo es de 782.213 ms considerando que previamente
ejecuté un VACUUM (verbose, analyze) rmcv;

A continuación información sobre el servidor:

Se tienen 8GB de memoria RAM

~$ sudo lshw -C DISK
  *-disk
       description: SCSI Disk
       product: LOGICAL VOLUME
       vendor: HP
       physical id: 0.0.0
       bus info: scsi@0:0.0.0
       logical name: /dev/sda
       version: 5.14
       serial: PACCRID12051LHD
       size: 419GiB (450GB)
       capabilities: 15000rpm partitioned partitioned:dos
       configuration: ansiversion=5 signature=000abeda

Sólo hay una única partición sobre LVM.
$ df -h
/dev/mapper/brmsuiste--riskguard--des--vg-root   405G   242G  143G  63% /
...

(Procesador doble núcleo, sólo muestro uno)
sudo lshw -C CPU
  *-cpu:0
       description: CPU
       product: Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
       vendor: Intel Corp.
       physical id: 4
       bus info: cpu@0
       version: Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
       slot: Proc 1
       size: 1600MHz
       capacity: 2400MHz
       width: 64 bits
       clock: 532MHz


Los parámetros de entonación aplicados al postgresql fueron:

sysctl -w kernel.shmmax=2684354560

En postgresql.conf
shared_buffers = 2GB
effective_cache_size = 4GB
work_mem = 25MB
maintenance_work_mem = 128MB
random_page_cost = 1.0 # Este fué crucial dejarlo en uno.


Requiero que esa consulta sea más rápida. ¿Habrá algo más a nivel de
entonación que se pueda hacer? ¿Mi hardware ya no puede ejecutar más rapido?

Puede ser que 728 ms sea rápido sin embargo hay otros detalles que omito
acá para no desviarse del objetivo del post en donde este tiempo de
respuesta me resulta inaceptable.

Agradezco sus comentarios.


-- 
Saludos Cordiales.-
Alfredo Rico.
San Cristóbal - Venezuela.

Responder a