Todos los productos
Search
Centro de documentos

Hologres:Migrate from physical to logical partitioned tables

Última actualización: Sep 05, 2026

Las tablas particionadas físicas pueden presentar dos problemas de estabilidad a gran escala: saturación de metadatos cuando un table group supera las 10,000 tablas secundarias (particiones) y degradación del rendimiento por operaciones DDL frecuentes al agregar nuevas particiones todos los días. Hologres V3.1 introduce las tablas particionadas lógicas para resolver ambos problemas. Este tema describe cómo migrar una tabla particionada física existente a una tabla particionada lógica.

Cuándo migrar

Migre a una tabla particionada lógica si su tabla particionada física cumple alguna de las siguientes condiciones:

  • Un table group contiene más de 10,000 tablas secundarias, lo que genera un volumen muy grande de metadatos.

  • Se agregan nuevas particiones todos los días, lo que provoca operaciones DDL frecuentes.

Elegir un método de migración

Approach

When to use

Downtime

Risk

Verificación con escritura dual (recomendado)

Cualquier migración donde la continuidad del negocio sea importante

Mínimo: las tablas antigua y nueva se ejecutan en paralelo

Bajo

REBUILD (no recomendado)

Escenarios donde es aceptable tener una ventana de cambio más larga y permitir algunos errores de lectura o escritura

Más largo: las tareas de escritura se detienen durante la migración

Alto: las tareas pueden fallar antes de completar la adaptación

Migrar mediante verificación con escritura dual (recomendado)

Este método mantiene las tablas antigua y nueva ejecutándose en paralelo durante la migración, lo que minimiza el impacto en el negocio.

Descripción general

  1. Detenga las tareas de escritura de la tabla particionada física, cree una nueva tabla particionada lógica y copie los datos existentes.

  2. Cree una tarea de escritura para la nueva tabla y habilite la escritura dual en ambas tablas.

  3. Compruebe la nueva tabla particionada lógica.

  4. Cambie las consultas de negocio y las tareas de escritura a la nueva tabla.

  5. Adapte las tareas de operación y mantenimiento (O&M) a la nueva tabla.

Paso 1: Crear una tabla particionada lógica y cargar los datos existentes

Elija uno de los siguientes métodos según su situación.

Método 1: CLONE (recomendado para volúmenes de datos moderados sin cambios de esquema)

hg_clone_to_logical_partition crea automáticamente una nueva tabla particionada lógica y copia todos los datos de la tabla original. La tabla particionada física original no se elimina.

Importante

Detenga las tareas de escritura en tiempo real antes de ejecutar CLONE. Una vez que CLONE finalice, cree nuevas tareas de escritura que escriban en las tablas antigua y nueva de forma simultánea para mantener los datos sincronizados. Cuando termine la migración, compruebe a fondo ambas tablas, complete la adaptación de las tareas de importación, consulta y O&M, y luego elimine la tabla particionada física original.

CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');

Para volúmenes de datos grandes, ejecute CLONE de forma asíncrona para evitar tiempos de espera agotados. Después de enviarlo, use el query_id devuelto para consultar el progreso en Get query insights.

SET statement_timeout = 0;
ASYNC CALL hg_clone_to_logical_partition('user_profile', 'user_profile_logical');

Método 2: Migración manual (para cambios de esquema o volúmenes de datos grandes)

La migración manual le permite optimizar el esquema de la tabla y controlar el ritmo de la migración.

Importante

Detenga las tareas de escritura en tiempo real antes de importar los datos. Cuando termine la importación, cree nuevas tareas de escritura que escriban en ambas tablas de forma simultánea. Al finalizar la migración, compruebe a fondo ambas tablas, complete la adaptación de las tareas de importación, consulta y O&M, y luego elimine la tabla particionada física original.

  1. Cree la tabla particionada lógica. Consulte Table schema conversion para conocer los cambios DDL necesarios.

  2. Importe los datos históricos con hg_insert_overwrite:

    CALL hg_insert_overwrite('logical_partition_table', '{20250601, 20250602}'::text[], 'SELECT * FROM tb');

Paso 2: Habilitar la escritura dual

Cree una nueva tarea de escritura para la tabla particionada lógica y ejecútela junto con la tarea de escritura existente de la tabla particionada física. Esto garantiza que ambas tablas permanezcan sincronizadas durante el periodo de verificación.

Paso 3: Comprobar la nueva tabla

Ejecute sus consultas de negocio sobre la tabla particionada lógica y confirme que los datos y el comportamiento coincidan con los de la tabla particionada física.

Paso 4: Cambiar el negocio a la nueva tabla

Use uno de los siguientes métodos:

Opción A (recomendada): Actualice el nombre de la tabla en las tareas de consulta para que apunte a la nueva tabla particionada lógica y agregue condiciones de filtro de partición donde sea necesario.

Opción B: Use RENAME para intercambiar los nombres de las tablas de forma atómica:

Aviso

Esta operación cambia el nombre de las tablas existentes. Asegúrese de que sus tareas de escritura y consulta estén listas para apuntar a la tabla principal antes de ejecutarla.

BEGIN;
ALTER TABLE <source_table_name> RENAME TO <source_table_name_archive>;
ALTER TABLE <target_table_name> RENAME TO <source_table_name>;
COMMIT;

Después del cambio, actualice las tareas de escritura y consulta que antes apuntaban a tablas secundarias para que usen la tabla principal, y agregue condiciones de filtro de partición.

Paso 5: Adaptar las tareas de O&M

Actualice las tareas de O&M que difieran entre las tablas particionadas físicas y lógicas. Consulte O&M task adaptation para obtener más detalles.

Migrar mediante REBUILD (no recomendado)

Aviso

Durante la migración con REBUILD, algunas tareas de lectura y escritura pueden fallar. Utilice este método solo si es aceptable una ventana de cambio más larga y se toleran fallos breves en las tareas. No se recomienda usar este método para migrar tablas particionadas.

Cuando REBUILD finaliza, la tabla particionada física se renombra como tmp_rebuild_old_<query_id>_<unique_id>_<table_name>. Las tareas relacionadas pueden generar errores hasta que usted complete la adaptación de dichas tareas.

  1. Detenga las tareas de escritura de la tabla particionada física.

  2. Ejecute REBUILD para convertir la tabla:

    -- Add the NOT NULL constraint to the partition field.
    ASYNC REBUILD TABLE user_profile ALTER ds SET NOT NULL;
    
    -- Convert the physical partitioned table to a logical partitioned table (retains the original).
    ASYNC REBUILD TABLE user_profile WITH (keep_source) TO logical partition;

    Para obtener más información, consulte REBUILD.

  3. Actualice las tareas de escritura y reinícielas.

  4. Adapte las tareas de consulta a la nueva tabla particionada lógica.

  5. Adapte las tareas de O&M a la nueva tabla particionada lógica.

Conversión del esquema de la tabla

Al crear una tabla particionada lógica a partir del DDL de una tabla particionada física existente, aplique los siguientes cambios:

  • Agregue la palabra clave LOGICAL antes de PARTITION BY.

  • Agregue NOT NULL a la columna de clave de partición.

  • (Opcional) Agregue una segunda clave de partición. Las tablas particionadas físicas admiten una clave de partición; las tablas particionadas lógicas admiten hasta dos.

Tabla particionada física:

BEGIN;
CREATE TABLE user_profile (
    a TEXT,
    b TEXT,
    ds TEXT
)
PARTITION BY LIST (ds);
CREATE TABLE user_profile_202503 PARTITION OF user_profile FOR VALUES IN ('202503');
CREATE TABLE user_profile_202504 PARTITION OF user_profile FOR VALUES IN ('202504');
COMMIT;

Tabla particionada lógica con una clave de partición:

CREATE TABLE user_profile_lp_1 (
    a TEXT,
    b TEXT,
    ds TEXT NOT NULL)
LOGICAL PARTITION BY LIST (ds);

Tabla particionada lógica con dos claves de partición (al dividir ds en yy para el año y mm para el mes):

CREATE TABLE user_profile_lp_2 (
    a TEXT,
    b TEXT,
    yy TEXT NOT NULL,
    mm TEXT NOT NULL)
LOGICAL PARTITION BY LIST (yy, mm);

Adaptación de las tareas de importación

Si su tarea de importación escribe en la tabla particionada física mediante Fixed Plan, no necesita hacer cambios.

Si su tarea de importación escribe en tablas secundarias (particiones), aplique los siguientes cambios:

  • Elimine las instrucciones que crean tablas secundarias. Las tablas particionadas lógicas no tienen particiones físicas.

  • Cambie el nombre de la tabla de destino del nombre de la tabla secundaria al nombre de la tabla principal.

Escenario 1: Crear una tabla secundaria e importar datos

-- Original task: import data to physical partitioned table
CREATE TABLE user_profile_202505 PARTITION OF user_profile FOR VALUES IN ('202505');
INSERT INTO user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';

-- Updated task: import data to logical partitioned table
INSERT INTO user_profile_lp_1 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';

Escenario 2: Sobrescribir una partición con insert overwrite

Nota

Si la tarea original usa hg_insert_overwrite para sobrescribir varias particiones a la vez, divida las sobrescrituras por partición, ejecútelas de forma secuencial y utilice la sintaxis nativa de INSERT OVERWRITE después de migrar a una tabla particionada lógica.

-- Original: physical partitioned table (temporary table method)
CREATE TABLE tmp_user_profile_202505(a text, b text, ds text);
INSERT INTO tmp_user_profile_202505 SELECT a, b, ds FROM <source_table> WHERE ds = '202505';

BEGIN;
DROP TABLE IF EXISTS user_profile_202505;
ALTER TABLE tmp_user_profile_202505 RENAME TO user_profile_202505;
ALTER TABLE user_profile ATTACH PARTITION user_profile_202505 FOR VALUES IN ('202505');
COMMIT;

-- Original: physical partitioned table (hg_insert_overwrite method)
CALL hg_insert_overwrite('user_profile', '202505', $$SELECT a, b, mm FROM <source_table> WHERE ds='202505'$$);

-- Updated: logical partitioned table (native INSERT OVERWRITE)
INSERT OVERWRITE user_profile_lp_1 PARTITION (ds = '202505') SELECT a, b, ds FROM <source_table> WHERE ds='202505';

Adaptación de las tareas de consulta

Si su consulta apunta a la tabla principal: no necesita hacer cambios.

Si su consulta apunta a una tabla secundaria: modifíquela para que consulte la tabla principal y agregue una condición de filtro de partición.

-- Original: physical partitioned table
SELECT * FROM user_profile_202504;

-- Updated: logical partitioned table
SELECT * FROM user_profile_lp_1 WHERE ds = '202504';

Adaptación de las tareas de O&M

Algunas operaciones de O&M utilizan tablas del sistema o funciones distintas para las tablas particionadas lógicas.

Operation

Physical partitioned table

Logical partitioned table

Consultar el DDL de la tabla principal

Función hg_dump_script

Sin diferencias

Consultar las propiedades de la tabla principal

hologres.hg_table_properties

Sin diferencias

Consultar la lista de particiones

Query all child tables

hologres.hg_list_logical_partition

Consultar las propiedades de las particiones

hologres.hg_table_properties

hologres.hg_logical_partitioned_table_properties

Consultar el almacenamiento de la tabla principal

hg_table_storage_status

hg_partition_file_status

Asignación de propiedades y parámetros

En la siguiente tabla se muestra la correspondencia de los parámetros de particionamiento automático y otras propiedades de tabla entre las tablas particionadas físicas y lógicas.

Nota

Si la tabla particionada física original utiliza un campo que no es de tiempo (como TEXT) como clave de partición y emplea administración automática de particiones, Hologres V4.2 y versiones posteriores son compatibles con partition_expiration_time y partition_keep_hot_window en la tabla particionada lógica. También debe establecer partition_time_format para especificar el formato de hora. Las versiones anteriores a V4.2 no admiten esta configuración.

Módulo

Función

Tabla particionada física

Tabla particionada lógica

Particionamiento automático

Habilitar

auto_partitioning_enable

No hay un parámetro equivalente

Unidad de tiempo

auto_partitioning_time_unit

No requiere configuración independiente; solo se admiten particiones de tiempo

Zona horaria

auto_partitioning_time_zone

No hay un parámetro equivalente

Particiones creadas previamente

auto_partitioning_num_precreate

No hay un parámetro equivalente

Particiones por conservar

auto_partitioning_num_retention

partition_expiration_time

Particiones activas por conservar

auto_partitioning_num_hot

partition_keep_hot_window

Hora de programación

auto_partitioning_schd_start_time

No hay un parámetro equivalente

Formato de fecha y hora de la partición

auto_partitioning_time_format

No hay un parámetro equivalente

Administración de particiones

Conservar partición

keep_alive

keep_alive

Almacenamiento activo/inactivo

storage_mode

storage_mode

Registro binario

Habilitar (tabla principal)

binlog_level

binlog_level

Ciclo de vida (tabla principal)

binlog_ttl

binlog_ttl

Registro binario dinámico por partición

No compatible

partition_generate_binlog_window

Habilitar (particiones)

Se hereda de la tabla principal; no se admite su modificación

generate_binlog

Ciclo de vida (particiones)

Las particiones admiten modificaciones

Se hereda de la tabla principal; no se admite su modificación

Índices y propiedades de la tabla

bitmap_columns

Las particiones admiten modificaciones

Se hereda de la tabla principal; no se admite su modificación

dictionary_encoding_columns

Las particiones admiten modificaciones

Se hereda de la tabla principal; no se admite su modificación

orientation, table_group y otras propiedades

Se hereda de la tabla principal; no se admite su modificación

Se hereda de la tabla principal; no se admite su modificación

Clave principal, distribution_key, clustering_key y otros índices

Se hereda de la tabla principal; no se admite su modificación

Se hereda de la tabla principal; no se admite su modificación