(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo crear particiones de tablas en Data Warehouse: paso a paso

João Barros 01 de October de 2026 4 min de lectura

Este tutorial muestra cómo crear y gestionar particiones de tablas en un Data Warehouse para mejorar el rendimiento de las consultas, el mantenimiento y la carga incremental. Explica por qué las particiones y guía mediante un ejemplo práctico en SQL para particionar una tabla de hechos por fecha.

Prerequisitos

  • Conocimientos básicos de SQL (SELECT, CREATE TABLE, INSERT).
  • Un motor de Data Warehouse que soporte particionamiento (ej.: Azure Synapse, SQL Server, Snowflake, BigQuery).
  • Una tabla de hechos con columna de fecha (ej.: order_date).

Paso 1: Por qué particionar una tabla en Data Warehouse

Particionar divide físicamente los datos según una columna (normalmente fecha). Esto reduce I/O en consultas que filtran por esa columna, acelera el mantenimiento (eliminar datos antiguos) y facilita las cargas incrementales. Errores comunes incluyen particionar por demasiadas columnas o por cardinalidad alta — elegir la columna correcta es crítico.

Paso 2: Elegir la estrategia de partición

Decida entre range partitioning (por intervalo de fecha), list partitioning o hash partitioning. Para hechos temporales, range por día/mes/año es lo más común. Ejemplo: particionar por month(start) permite eliminar whole partitions mensualmente, útil para retención y archivado.

Paso 3: Crear una tabla particionada (ejemplo en T-SQL)

A continuación hay un ejemplo simple en SQL Server / Azure Synapse que usa partition function y partition scheme para crear una tabla de hechos particionada por mes en la columna order_date.

-- Criar uma function de partição por mês (valores de corte: primeiro dia de cada mês)  CREATE PARTITION FUNCTION pf_OrderDate(datetime)  AS RANGE RIGHT FOR VALUES  ('2026-01-01','2026-02-01','2026-03-01','2026-04-01');    -- Criar um partition scheme que usa filegroups (exemplo simples com PRIMARY)  CREATE PARTITION SCHEME ps_OrderDate  AS PARTITION pf_OrderDate TO (PRIMARY, PRIMARY, PRIMARY, PRIMARY, PRIMARY);    -- Criar tabela de factos particionada  CREATE TABLE factOrders (    order_id BIGINT NOT NULL,    order_date DATETIME NOT NULL,    product_id INT,    quantity INT,    amount DECIMAL(18,2)  ) ON ps_OrderDate (order_date);

Paso 4: Cargar datos en modo particionado y carga incremental

Al cargar, dirija la carga a las particiones correctas. Para cargas incrementales, inserte solo datos del periodo objetivo. Ejemplo de carga de un mes:

-- Inserir dados apenas de abril 2026 (carga incremental)  INSERT INTO factOrders (order_id, order_date, product_id, quantity, amount)  SELECT order_id, order_date, product_id, quantity, amount  FROM stagingOrders  WHERE order_date >= '2026-04-01' AND order_date < '2026-05-01';

Paso 5: Gestionar retención eliminando particiones antiguas

Para eliminar datos antiguos de forma eficiente, haga SWITCH OUT o MERGE de la partición y luego DROP. Ejemplo: eliminar datos de enero de 2026.

-- Criar tabela temporária com mesma estrutura e sem constraints  CREATE TABLE factOrders_Archive (    order_id BIGINT NOT NULL,    order_date DATETIME NOT NULL,    product_id INT,    quantity INT,    amount DECIMAL(18,2)  );    -- Mover (SWITCH) a partição de janeiro para a tabela de archive (exemplo conceptual)  ALTER TABLE factOrders SWITCH PARTITION 1 TO factOrders_Archive;    -- Depois pode truncar ou arquivar a tabela factOrders_Archive  TRUNCATE TABLE factOrders_Archive;

Paso 6: Reorganizar y mantener particiones

Ejecute mantenimiento regular: rebuild/reorganize de índices por partición y actualizar estadísticas para mantener el rendimiento. Ejemplo de rebuild para una partición específica.

-- Rebuild do índice clustered na partição 2 (exemplo)  ALTER INDEX ALL ON factOrders REBUILD PARTITION = 2;

Verificar el resultado

Confirme que las particiones se están usando y que las consultas filtradas por date son más rápidas. Verifique metadatos de partición y tiempo de ejecución:

-- Listar partições e row counts (SQL Server)  SELECT p.partition_number, p.rows, rng.value AS RangeBoundary  FROM sys.partitions p  JOIN sys.indexes i ON p.object_id = i.object_id AND p.index_id = i.index_id  JOIN sys.partition_range_values rng ON rng.function_id = OBJECT_ID('pf_OrderDate')  WHERE OBJECT_NAME(p.object_id) = 'factOrders';    -- Teste de desempenho: comparar tempos de query com e sem filtro por order_date  SET STATISTICS TIME ON;  SELECT SUM(amount) FROM factOrders WHERE order_date >= '2026-04-01' AND order_date < '2026-05-01';  SET STATISTICS TIME OFF;

Conclusión

Particionar tablas en un Data Warehouse mejora drásticamente las consultas temporales y simplifica la retención. Próximos pasos: probar otras estrategias (hash, list), implementar particionamiento automático y monitorizar los planes de ejecución. Consejo: empiece con una granularidad mensual y ajuste según el patrón de consultas — ¿qué periodicidad tiene más sentido para sus informes?