0 evaluări0% au considerat acest document util (0 voturi)
77 vizualizări4 pagini
El documento describe cómo particionar una tabla por fecha en MySQL y PostgreSQL para organizar y almacenar los datos de manera más eficiente. En MySQL, la tabla se particiona utilizando el campo fecha y creando particiones para cada mes del año. En PostgreSQL, se crean tablas heredadas para cada mes y una función dispara la inserción de datos en la tabla correspondiente.
El documento describe cómo particionar una tabla por fecha en MySQL y PostgreSQL para organizar y almacenar los datos de manera más eficiente. En MySQL, la tabla se particiona utilizando el campo fecha y creando particiones para cada mes del año. En PostgreSQL, se crean tablas heredadas para cada mes y una función dispara la inserción de datos en la tabla correspondiente.
El documento describe cómo particionar una tabla por fecha en MySQL y PostgreSQL para organizar y almacenar los datos de manera más eficiente. En MySQL, la tabla se particiona utilizando el campo fecha y creando particiones para cada mes del año. En PostgreSQL, se crean tablas heredadas para cada mes y una función dispara la inserción de datos en la tabla correspondiente.
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);
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();