Re: [pgsql-es-ayuda] Migración de datos atablaparticionada

From: Eduard Miquel i Gavaldà <eduard(dot)miquel(at)urv(dot)net>
To: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: [pgsql-es-ayuda] Migración de datos atablaparticionada
Date: 2007-06-08 08:39:10
Message-ID: 1181291950.30789.33.camel@emiquel-desktop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola,
ahí va la descripción de la tabla y un par de EXPLAIN ANALYZE de
consultas habituales.

CREATE TABLE mdl_log
(
id serial NOT NULL,
"time" int4 NOT NULL DEFAULT 0,
userid int4 NOT NULL DEFAULT 0,
ip varchar(15) NOT NULL DEFAULT ''::character varying,
course int4 NOT NULL DEFAULT 0,
module varchar(20) NOT NULL DEFAULT ''::character varying,
cmid int4 NOT NULL DEFAULT 0,
"action" varchar(15) NOT NULL DEFAULT ''::character varying,
url varchar(100) NOT NULL DEFAULT ''::character varying,
info varchar(255) NOT NULL DEFAULT ''::character varying,
CONSTRAINT mdl_log_pkey PRIMARY KEY (id),
CONSTRAINT mdl_log_cmid_check CHECK (cmid >= 0),
CONSTRAINT mdl_log_course_check CHECK (course >= 0),
CONSTRAINT mdl_log_time_check CHECK ("time" >= 0),
CONSTRAINT mdl_log_userid_check CHECK (userid >= 0)
)

Tiene los siguientes índices:

INDEX coursemoduleaction: course, module, "action";
INDEX courseuserid: userid, course;
INDEX mdl_log_info_idx: info;
INDEX timecoursemoduleaction: "time", course, module, "action";

La primera consulta filtra a partir de una fecha determinada:

explain analyze
select * from mdl_log where time > round(date_part('epoch', timestamp
'2007-01-30 00:00:00')) order by time asc

QUERY PLAN
Sort (cost=2144506.77..2158099.67 rows=5437160 width=83) (actual
time=52324.373..60723.319 rows=4751857 loops=1)
Sort Key: "time"
-> Seq Scan on mdl_log (cost=0.00..495522.22 rows=5437160 width=83)
(actual time=5.056..41224.555 rows=4751857 loops=1)
Filter: (("time")::double precision > 1170111600::double precision)
Total runtime: 62412.659 ms

A partir de esta misma consulta, si utilizo la clásusula LIMIT 100 da el
seguiente resultado:

QUERY PLAN
Limit (cost=0.00..523.01 rows=100 width=83) (actual
time=185149.917..185150.125 rows=100 loops=1)
-> Index Scan using timecoursemoduleaction on mdl_log
(cost=0.00..28436911.33 rows=5437160 width=83) (actual
time=185149.913..185150.039 rows=100 loops=1)
Filter: (("time")::double precision > 1170111600::double precision)
Total runtime: 185150.204 ms

La segunda consulta utiliza un filtro un poco más complejo:

explain analyze
select * from mdl_log
where time > round(date_part('epoch', timestamp '2007-01-30 00:00:00'))
and course = '5020' and module = 'course' and action like 'view%' order
by time asc;

QUERY PLAN
Sort (cost=17736.54..17739.83 rows=1318 width=83) (actual
time=59.422..60.643 rows=2744 loops=1)
Sort Key: "time"
-> Index Scan using coursemoduleaction on mdl_log (cost=0.00..17668.24
rows=1318 width=83) (actual time=1.353..55.694 rows=2744 loops=1)
Index Cond: ((course = 5020) AND ((module)::text = 'course'::text))
Filter: ((("time")::double precision > 1170111600::double precision) AND
(("action")::text ~~ 'view%'::text))
Total runtime: 61.665 ms

Lo que agradecería que me explicarais:

- ¿descartada a priori la vía particionado, cómo creéis que puedo
mejorar el tema?
- ¿por qué si utilizo un limitador LIMIT 100 la primera consulta tarda
muchísimo más, incluso con el índice "timecoursemoduleaction"? ¿Es este
índice perjudicial y culpable de la lentitud?
- ¿cómo gestiona los índices PostgreSQL? ¿En función de qué utiliza uno
u otro?
- la verdad es que no alcanzo a comprender los parámetros de salida
"cost", "rows" y el "time" desglosados... ya me perdonaréis

Uf, lo siento por el tostón que os he pegado, pero a ver si con vuestra
ayuda aprendo a andar solo con este tema.

Muchas gracias,

Eduard

El dj 07 de 06 del 2007 a les 12:05 -0400, en/na Alvaro Herrera va
escriure:

> Eduard Miquel i Gavaldà escribió:
>
> Hola,
>
> > la verdad es que te agradeceré las ideas que me puedas dar y si me
> > ahorro trabajo, pues mejor.
> >
> > Básicamente en la tabla se ejecutan inserts y selects. Se trata de una
> > tabla de logs de una aplicación. La principal utilidad es registrar las
> > acciones de los usuarios y consultarlas posteriormente, filtrando por
> > tiempo, fundamentalmente.
>
> Lo más probable es que no necesites particionado. De hecho es posible
> que el funcionamiento sea _más lento_ con particionado.
>
> > ¿Cómo crees que puedo optimizar el rendimiento? Estoy aún comprobando el
> > funcionamento de los índices de que dispongo con el EXPLAIN ANALYZE,
> > aunque no tengo muy claro su funcionamento... :-(
>
> Manda los EXPLAIN ANALYZE a ver si te los podemos explicar ... ¿Qué
> versión de Postgres estás usando?
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Roberto Tortolero 2007-06-08 13:15:39 Re: Almacenamiento de imagenes en PostgreSQL 8.2.4
Previous Message Milton Galo Patricio Inostroza Aguilera 2007-06-08 04:00:46 Re: Esquema para manejo de usuarios que hago?