Re: Particionamiento de Tablas

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Fabio Arias <fharias(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Particionamiento de Tablas
Date: 2009-10-15 12:19:03
Message-ID: 20091015121902.GA4789@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Fabio Arias escribió:
> Alvaro esto es lo que tengo pero por mas que quiero poner
> constraint_exclusion en ON sigue barriendo por todo

Creo que el problema es que el CHECK que escogiste de particionamiento
no es muy bueno:

> Tabla Hija
>
> CREATE TABLE "MOVIMIENTO_JULIO"
> (
> CONSTRAINT "MOVIMIENTO_JULIO_pkey" PRIMARY KEY ("MOVI_ID"),
> CONSTRAINT "MOVIMIENTO_JULIO_MOVI_FECHAMOVIMIENTO_check" CHECK
> (to_char("MOVI_FECHAMOVIMIENTO", 'YYYY-MM'::text) = '2009-07'::text)
> )
> INHERITS ("MOVIMIENTO")

De partida estás usando to_char, que es una función que debería evitarse
a toda costa. Pero más importante que eso es que la columna es de tipo
timestamp with time zone, lo que complica las cosas porque la gran
mayoría de las operaciones que le puedes aplicar no son inmutables
debido a que pueden cambiar con la variable TimeZone. Por lo tanto el
optimizador decide que no se puede particionar de esta forma. Si lees
la documentación, por ahí debe decir que uno de los requisitos es que el
CHECK debe llevar una expresión inmutable.

Lo más simple que puedes hacer es cambiar el campo, en vez de tipo
timestamp with time zone puedes ponerla como date, y la hora meterla en
otra columna (si realmente la necesitas).

Si eso no te sirve, puedes usar una expresión más compleja en el CHECK,
que convierta el timestamp with time zone en timestamp without time zone
(por ejemplo "MOVI_FECHAMOVIMIENTO" AT TIME ZONE GMT).

> Tabla Master
> CREATE TABLE "MOVIMIENTO"
> (
> "MOVI_ID" serial NOT NULL,
> "TIMO_ID" integer NOT NULL,
> "CUEN_ID" integer NOT NULL,
> "TRAN_ID" integer NOT NULL,
> "MOVI_SALDOINICIAL" double precision NOT NULL,
> "MOVI_SOBREGIROINICIAL" double precision NOT NULL DEFAULT 0,
> "MOVI_VALOR" character varying(20) NOT NULL,
> "MOVI_COMISION" double precision,
> "MOVI_SALDOFINAL" double precision NOT NULL,
> "MOVI_SOBREGIROFINAL" double precision NOT NULL DEFAULT 0,
> "MOVI_FECHAMOVIMIENTO" timestamp without time zone NOT NULL DEFAULT now(),
> CONSTRAINT "MOVIMIENTO_pkey" PRIMARY KEY ("MOVI_ID", "TRAN_ID"),
> CONSTRAINT "MOVIMIENTO_CUEN_ID_fkey" FOREIGN KEY ("CUEN_ID")
> REFERENCES "CUENTA" ("CUEN_ID") MATCH SIMPLE
> ON UPDATE RESTRICT ON DELETE RESTRICT,
> CONSTRAINT "MOVIMIENTO_TIMO_ID_fkey" FOREIGN KEY ("TIMO_ID")
> REFERENCES "TIPOMOVIMIENTO" ("TIMO_ID") MATCH SIMPLE
> ON UPDATE RESTRICT ON DELETE RESTRICT,
> CONSTRAINT "MOVIMIENTO_TRAN_ID_fkey" FOREIGN KEY ("TRAN_ID")
> REFERENCES "TRANSACCION" ("TRAN_ID") MATCH SIMPLE
> ON UPDATE RESTRICT ON DELETE RESTRICT,
> CONSTRAINT "MOVIMIENTO_MOVI_ID_key" UNIQUE ("MOVI_ID")
> )
> WITH (OIDS=TRUE)
> TABLESPACE cxr_tbl;
>

--
Alvaro Herrera http://planet.postgresql.org/
"Once again, thank you and all of the developers for your hard work on
PostgreSQL. This is by far the most pleasant management experience of
any database I've worked on." (Dan Harris)
http://archives.postgresql.org/pgsql-performance/2006-04/msg00247.php

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2009-10-15 12:21:56 Re: Usar varias BDs o una sola?
Previous Message Rafael Martinez 2009-10-15 08:29:29 Re: Particionamiento de Tablas