Saltar al contenido principal
Avanzado
20 min de lectura

Particiones

Divide tablas grandes en partes más pequeñas y manejables

El particionamiento divide una tabla grande en fragmentos más pequeños (particiones) para mejorar el rendimiento y la gestión.

Tipos de particiones

#

Partición por rango

sql
1CREATE TABLE ventas (2    id SERIAL,3    fecha DATE NOT NULL,4    total DECIMAL NOT NULL5) PARTITION BY RANGE (fecha);6 7CREATE TABLE ventas_2024_q1 PARTITION OF ventas8    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');9 10CREATE TABLE ventas_2024_q2 PARTITION OF ventas11    FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

#

Partición por lista

sql
1CREATE TABLE usuarios (2    id SERIAL,3    nombre TEXT,4    pais TEXT NOT NULL5) PARTITION BY LIST (pais);6 7CREATE TABLE usuarios_es PARTITION OF usuarios8    FOR VALUES IN ('España', 'México', 'Argentina');9 10CREATE TABLE usuarios_us PARTITION OF usuarios11    FOR VALUES IN ('USA', 'Canadá');

#

Partición por hash

sql
1CREATE TABLE logs (2    id SERIAL,3    mensaje TEXT,4    nivel TEXT5) PARTITION BY HASH (id);6 7CREATE TABLE logs_0 PARTITION OF logs FOR VALUES WITH (MODULUS 4, REMAINDER 0);8CREATE TABLE logs_1 PARTITION OF logs FOR VALUES WITH (MODULUS 4, REMAINDER 1);9CREATE TABLE logs_2 PARTITION OF logs FOR VALUES WITH (MODULUS 4, REMAINDER 2);10CREATE TABLE logs_3 PARTITION OF logs FOR VALUES WITH (MODULUS 4, REMAINDER 3);

Ventajas

  • Mejor rendimiento en consultas con filtros por clave de partición
  • Mantenimiento más fácil (purgar particiones antiguas)
  • Carga paralela de datos
  • Sintaxis

    Sintaxis
    sql
    1CREATE TABLE nombre (2    columnas3) PARTITION BY {RANGE | LIST | HASH} (columna);4 5CREATE TABLE particion PARTITION OF nombre6    FOR VALUES FROM (inicio) TO (fin);

    Ejemplos

    Partición por fecha

    Ventas particionadas por trimestre

    Ejemplo
    sql
    1CREATE TABLE ventas_2024 (2    id SERIAL,3    fecha DATE,4    total DECIMAL5) PARTITION BY RANGE (fecha);6 7CREATE TABLE ventas_q1 PARTITION OF ventas_20248    FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');9 10INSERT INTO ventas_2024 (fecha, total)11VALUES ('2024-02-15', 1500);12 13SELECT * FROM ventas_q1;

    Resultado:

    | id | fecha      | total |
    |----|------------|-------|
    | 1  | 2024-02-15 | 1500  |