1. Clase: BDD, 27/10/15
Fragmentación de tablas – Postgresql
1. Abrir ventana para consultas sql.
2. Crear la tabla principal, la cual será fragmentada, con el siguiente query:
CREATE TABLE BDD1(
id serialNOT NULL,
desdeintegerNOT NULL,
para integerNOT NULL,
texto text,
fecha timestampwithouttimezoneNOT NULL )
WITH( OIDS = FALSE ) ; ALTERTABLE BDD1OWNERTOpostgres;
3. Se crean 3 tablas, las cuales tendrán el contenido fragmentado. Cada una
asociada a un mes: enero, febrero y marzo. Estas tablas contendrán los
registros que correspondan al mes, de acuerdo a la tabla bdd1.
------Mes uno de 2010
CREATE TABLE frag_2010_t1 ( CONSTRAINT chk_fecha_a2010m01 CHECK (fecha >= '2010-01-
01'::date AND fecha <= '2010-01-31'::date) ) INHERITS (bdd1) WITH ( OIDS = FALSE ) ; ALTER
TABLE frag_2010_t1 OWNER TO postgres;
2. ------Mes dos de 2010
CREATE TABLE frag_2010_t2 ( CONSTRAINT chk_fecha_a2010m02 CHECK (fecha >= '2010-02-
01'::date AND fecha <= '2010-02-28'::date) ) INHERITS (bdd1) WITH ( OIDS = FALSE ) ; ALTER
TABLE frag_2010_t2 OWNER TO postgres;
------Mes tres de 2010
CREATE TABLE frag_2010_t3 ( CONSTRAINT chk_fecha_a2010m01 CHECK (fecha >= '2010-03-
01'::date AND fecha <= '2010-03-31'::date) ) INHERITS (bdd1) WITH ( OIDS = FALSE ) ALTER
TABLE frag_2010_t3 OWNER TO postgres;
4. Se crean los índices para cada tabla de fragmentos.
----------- indices
CREATE INDEX ix_fecha_bdd1_2010_t1 ON frag_2010_t1 (fecha ASC NULLS
LAST); CREATE INDEX ix_fecha_bdd1_2010_t2 ON frag_2010_t2 (fecha ASC
NULLS LAST); CREATE INDEX ix_fecha_bdd1_2010_t3 ON frag_2010_t3 (fecha
ASC NULLS LAST);
5. Se crea una función para un trigger (posteriormente se crea) el cual,
fragmentará la tabla bdd1, de acuerdo a las especificaciones siguientes:
-- funcion trigger
CREATE OR REPLACE FUNCTION bdd1_insert_trigger() RETURNS trigger AS
$BODY$begin if (new.fecha >= date '2010-01-01' and new.fecha <= date '2010-01-
31') then insert into frag_2010_t1 values (new.*); elsif (new.fecha >= date '2010-
02-01' and new.fecha <= date '2010-02-28') then insert into frag_2010_t2 values
(new.*); elsif (new.fecha >= date '2010-03-01' and new.fecha <= date '2010-03-
31') then insert into frag_2010_t3 values (new.*); else raise exception 'Rango
de fecha desbordado, amplie la funcion en el trigger sms_insert_trigger()'; end if;
return null; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; ALTER
FUNCTION bdd1_insert_trigger() OWNER TO postgres;
6. Se crea el trigger y se invoca a la función previamente creada.
-- trigger
CREATE TRIGGER insert_bdd1_trigger BEFORE INSERT ON bdd1 FOR EACH
ROW EXECUTE PROCEDURE bdd1_insert_trigger();
7. Finalmente, se llena la tabla bdd1. En consecuencia las tablas que
almacenan fragmentos, deberán tener los registros correspondientes.
-- llenamos la tabla