Particionado por rango, lista y hash
Elija la estrategia de particionado adecuada: rango para series temporales, lista para inquilinos y hash para una distribución uniforme.
Particionado por rango, lista y hash es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Particionamiento por rangos
Cada partición abarca un rango continuo de valores. Es lo más habitual en series temporales:
CREATE TABLE events (
id BIGSERIAL,
ts TIMESTAMPTZ NOT NULL,
data JSONB
) PARTITION BY RANGE (ts);
CREATE TABLE events_2024_q1 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');Los límites de rango son semiabiertos
FROM es inclusivo y TO es exclusivo. Los límites encajan limpiamente: sin solapamientos ni espacios.
Particionamiento por lista
Cada partición contiene valores específicos:
CREATE TABLE customers (
id BIGSERIAL,
country TEXT NOT NULL,
name TEXT
) PARTITION BY LIST (country);
CREATE TABLE customers_us PARTITION OF customers FOR VALUES IN ('US');
CREATE TABLE customers_eu PARTITION OF customers FOR VALUES IN ('DE','FR','IT','ES','NL');
CREATE TABLE customers_other PARTITION OF customers DEFAULT;Partición DEFAULT
Captura las filas que no coinciden con ninguna otra partición. Sin ella, los INSERT de filas que no coincidan con ninguna partición fallan.
Particionamiento hash
Las filas se distribuyen aplicando un hash a la clave de particionamiento. Es útil cuando se desea una distribución uniforme, pero no existe un rango o una lista naturales:
CREATE TABLE sessions (
id UUID,
user_id BIGINT,
data JSONB
) PARTITION BY HASH (user_id);
CREATE TABLE sessions_0 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE sessions_1 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE sessions_2 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE sessions_3 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 3);Elegir una estrategia
- Rango: series temporales e identificadores que crecen de forma monótona
- Lista: inquilinos, países y niveles de alta prioridad
- Hash: cuando no hay una distribución natural, pero se busca paralelismo
Subparticionamiento
Las particiones pueden particionarse a su vez (en varios niveles):
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
PARTITION BY HASH (user_id);
-- 2024 is a yearly range partition, internally hashed by user_id.Índices en tablas particionadas
Los índices de la tabla padre se propagan automáticamente a todas las particiones. Las restricciones UNIQUE deben incluir la clave de particionamiento:
CREATE INDEX events_user_idx ON events (user_id);
-- Creates one index per partition automatically.
ALTER TABLE events ADD CONSTRAINT events_uniq UNIQUE (id, ts);
-- ts must be in the constraint because it's the partition key.Claves primarias y particiones
La PRIMARY KEY de una tabla particionada debe incluir la columna de particionamiento. Esta es una restricción fundamental del particionamiento declarativo.
Añadir y eliminar particiones
Operaciones rápidas:
CREATE TABLE events_2024_q3 PARTITION OF events
FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');
DROP TABLE events_2023_q1;
-- Instant; equivalent to deleting all old data.Creación automática de particiones
Postgres no crea automáticamente las particiones futuras. Soluciones habituales:
- Extensión pg_partman: particiones mensuales gestionadas
- Tarea programada que ejecute CREATE para crear la siguiente partición
Claves foráneas
Las FK hacia una tabla particionada requieren PG 12 o posterior. Las FK desde una tabla particionada hacia una tabla normal funcionan con normalidad.
Resumen
Tres estrategias de particionamiento cubren la mayoría de los casos.
- Rango para datos temporales o secuenciales
- Lista para conjuntos discretos
- Hash para una distribución uniforme
- La PK debe incluir la columna de particionamiento
Comprobación rápida
Desea particionar una tabla de sesiones por user_id con una distribución uniforme y sin un orden natural. ¿Qué estrategia elegiría?
Preguntas frecuentes
¿La lección «Particionado por rango, lista y hash» es gratis?
Sí — el texto completo de «Particionado por rango, lista y hash» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Particionado por rango, lista y hash»?
Elija la estrategia de particionado adecuada: rango para series temporales, lista para inquilinos y hash para una distribución uniforme. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Particionado por rango, lista y hash»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué particionar: poda y mantenimiento
- Particionado por rango, lista y hash
- Desconexión y conexión de particiones
- Consultas eficientes entre particiones