Sunteți pe pagina 1din 4

Particionado de tablas en MySQL.

1.- Creamos la base de datos Empresa



2.- Creamos la tabla Reportes
CREATE TABLE Reportes (
id_ciudad int (10) NOT NULL AUTO_INCREMENT,
fecha datetime NOT NULL,
temperatura int,
PRIMARY KEY (id, fecha)
);
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Se aadi como ndice de la tabla el campo fecha, esto es necesario para poder
particionar la tabla.

3.- Una vez creada la tabla vamos a particionar por mes:
ALTER TABLE Reportes PARTITION BY RANGE(TO_DAYS(fecha))(
PARTITION datosEne2014 VALUES LESS THAN (TO_DAYS("2014-02-01")),
PARTITION datosFeb2014 VALUES LESS THAN (TO_DAYS("2014-03-01")),
PARTITION datosMar2014 VALUES LESS THAN (TO_DAYS("2014-04-01")),
PARTITION datosAbr2014 VALUES LESS THAN (TO_DAYS("2014-05-01")),
PARTITION datosMay2014 VALUES LESS THAN (TO_DAYS("2014-06-01")),
PARTITION datosDefault VALUES LESS THAN MAXVALUE
);
La ltima particin (partDefault) tendr todos los registros que no entren en las
particiones anteriores. De esta manera nos aseguramos que la informacin nunca dejar
de insertarse en la tabla.


Particionado de tablas en PostgreSQL

1.- Creamos la base de datos Empresa

2.- Creamos la tabla Reportes
CREATE TABLE Reportes (
id_cuidad int NOT NULL,
fecha date NOT NULL,
temperatura int,
);
3.- Creamos las particiones correspondientes:
CREATE TABLE datosEne2014 (
CHECK (fecha >= DATE '2014-01-01' AND fecha < DATE '2014-02-01')
) INHERITS (Reportes);
CREATE TABLE datosFeb2014 (
CHECK (fecha >= DATE '2014-02-01' AND fecha < DATE '2014-03-01')
) INHERITS (Reportes);
CREATE TABLE datosMar2014 (
CHECK (fecha >= DATE '2014-03-01' AND fecha < DATE '2014-04-01')
) INHERITS (Reportes);
CREATE TABLE datosAbr2014 (
CHECK (fecha >= DATE '2014-04-01' AND fecha < DATE '2014-05-01')
) INHERITS (Reportes);
CREATE TABLE datosMay2014 (
CHECK (fecha >= DATE '2014-05-01' AND fecha < DATE '2014-06-01')
) INHERITS (Reportes);

CREATE TABLE datosDefault (
CHECK (fecha >= DATE '2014-06-01')
) INHERITS (Reportes);

4.- Aadimos los ndices para cada tabla creada.
CREATE INDEX datosEne2014_fecha ON datosEne2014 (fecha);
CREATE INDEX datosFeb2014_fecha ON datosFeb2014 (fecha);
CREATE INDEX datosMar2014_fecha ON datosMar2014 (fecha);
CREATE INDEX datosAbr2014_fecha ON datosAbr2014 (fecha);
CREATE INDEX datosMay2014_fecha ON datosMay2014 (fecha);
CREATE INDEX datosDefault_fecha ON datosDefault (fecha);

5.- Creamos una funcin para agregar los datos automticamente a cada tabla despus de
cada insercin.

CREATE OR REPLACE FUNCTION funcionReportes()
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.fecha >= DATE '2014-01-01' AND
NEW.fecha < DATE '2014-02-01') THEN
INSERT INTO datosEne2014 VALUES (NEW.*);
ELSIF (NEW.fecha >= DATE '2014-02-01' AND
NEW.fecha < DATE '2014-03-01') THEN
INSERT INTO datosFeb2014 VALUES (NEW.*);
ELSIF (NEW.fecha >= DATE '2014-03-01' AND
NEW.fecha < DATE '2014-04-01') THEN
INSERT INTO datosMar2014 VALUES (NEW.*);

ELSIF (NEW.fecha >= DATE '2014-04-01' AND
NEW.fecha < DATE '2014-05-01') THEN
INSERT INTO datosAbr2014 VALUES (NEW.*);
ELSIF (NEW.fecha >= DATE '2014-05-01' AND
NEW.fecha < DATE '2014-06-01') THEN
INSERT INTO datosMay2014 VALUES (NEW.*);
ELSIF (NEW.fecha >= DATE '2014-06-01') THEN
INSERT INTO datosDefault VALUES (NEW.*);
ELSE
RAISE EXCEPTION 'Dato fuera del rango';
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;

6.- Despus de crear la funcin, se crea un desencadenador que llama a la funcin
funcionReportes():

CREATE TRIGGER triggerReportes
BEFORE INSERT ON Reportes
FOR EACH ROW EXECUTE PROCEDURE funcionReportes();

S-ar putea să vă placă și