ALTER PARTITION FUNCTION (Transact-SQL)

Modifica una función de partición dividiendo o mezclando sus valores de límite. Ejecutando ALTER PARTITION FUNCTION, se puede dividir una partición de cualquier tabla o índice que utilice la función de partición en dos particiones, o bien se pueden mezclar dos particiones en una partición menos.

Nota de advertenciaAdvertencia

Varias tablas o índices pueden utilizar la misma función de partición. ALTER PARTITION FUNCTION afecta a todas ellas en una única transacción.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

ALTER PARTITION FUNCTION partition_function_name()
{ 
    SPLIT RANGE ( boundary_value )
  | MERGE RANGE ( boundary_value ) 
} [ ; ]

Argumentos

  • partition_function_name
    Es el nombre de la función de partición que se va a modificar.

  • SPLIT RANGE ( boundary_value )
    Agrega una partición a la función de partición. El argumento boundary_value determina el intervalo de la nueva partición y debe diferir de los intervalos de límites existentes de la función de partición. Basado en boundary_value, Motor de base de datos divide en dos uno de los intervalos existentes. De estos dos, se considera la partición nueva aquél donde reside el nuevo boundary_value.

    Debe existir un grupo de archivos en línea y estar marcado por el esquema de partición que utiliza la función de partición como NEXT USED para contener la nueva partición. Los grupos de archivos se asignan a particiones de una instrucción CREATE PARTITION SCHEME. Si la instrucción CREATE PARTITION SCHEME asigna más grupos de archivos de los necesarios (se crean menos particiones en la instrucción CREATE PARTITION FUNCTION que grupos de archivos para contenerlos), habrá entonces grupos de archivos sin asignar y el esquema de partición marcará uno de ellos como NEXT USED. Este grupo de archivos contendrá la partición nueva. Si no hay grupos de archivos marcados como NEXT USED por el esquema de partición, debe usar ALTER PARTITION SCHEME para agregar un grupo de archivos o designar uno existente a fin de que contenga la partición nueva. Se puede designar a un grupo de archivos que ya contenga particiones para contener particiones adicionales. Puesto que una función de partición puede participar en más de un esquema de partición, todos los esquemas de partición que utilizan la función de partición a la que esté agregando particiones deben tener un grupo de archivos NEXT USED. De lo contrario, ALTER PARTITION FUNCTION produce un error que muestra el esquema o esquemas de partición a los que les falta un grupo de archivos NEXT USED.

    Si crea todas las particiones en el mismo grupo de archivos, ese grupo se asigna inicialmente para que sea el grupo de archivos NEXT USED automáticamente. Sin embargo, después de realizarse una operación de división ya no hay ningún grupo de archivos NEXT USED designado. Debe asignar explícitamente el grupo de archivos para que sea el grupo de archivos NEXT USED usando ALTER PARTITION SCHEME; de lo contrario, una operación de división posterior producirá errores.

  • MERGE [ RANGE ( boundary_value) ]
    Quita una partición y mezcla cualquier valor que exista en la partición en una de las particiones restantes. RANGE (boundary_value) debe ser un valor de límite existente, en el que se mezclan los valores de la partición quitada. El grupo de archivos que originalmente contenía boundary_value se quita del esquema de partición, a menos que lo utilice una partición restante o que esté marcado con la propiedad NEXT USED. La partición mezclada se encuentra en el grupo de archivos que originalmente no contenía boundary_value. boundary_value es una expresión constante que puede hacer referencia a variables (incluidas variables de tipos definidos por el usuario) o funciones (incluidas funciones definidas por el usuario). No puede hacer referencia a una expresión de Transact-SQL. boundary_value debe coincidir con el tipo de datos de su columna de creación de particiones correspondiente o ser susceptible de convertirse de forma implícita a él, y no se puede truncar durante la conversión implícita de forma que el tamaño y la escala del valor no coincidan con el de su parámetro input_parameter_type correspondiente.

Procedimientos recomendados

Mantenga siempre las particiones vacías en ambos extremos del rango de partición para garantizar que la división de particiones (antes de cargar nuevos datos) y la combinación de particiones (después de descargar datos antiguos) no realicen ningún movimiento de datos. Evite dividir o combinar particiones con datos. Esto puede ser extremadamente ineficaz, ya que puede multiplicar por cuatro la generación de registros y causar bloqueos graves.

Limitaciones y restricciones

ALTER PARTITION FUNCTION vuelve a crear particiones en cualquier tabla o índice que utilice la función en una única operación atómica. Sin embargo, esta operación se produce sin conexión, y dependiendo del alcance de las reparticiones puede consumir muchos recursos.

ALTER PARTITION FUNCTION se puede utilizar solamente para dividir una partición en dos o mezclar dos particiones en una. Para cambiar el modo en el que se crean particiones en una tabla (por ejemplo, de 10 particiones a 5), puede aplicar cualquiera de las opciones siguientes. Dependiendo de la configuración del sistema, estas opciones pueden tener un consumo de recursos diferente:

  • Cree una nueva tabla con particiones con la función de partición deseada y, a continuación, inserte los datos de la tabla antigua en la tabla nueva mediante la instrucción INSERT INTO...SELECT FROM.

  • Cree un índice clúster con particiones en un montón.

    Nota

    El resultado de quitar un índice clúster con particiones es un montón con particiones.

  • Quite y vuelva a generar un índice con particiones existente mediante la instrucción CREATE INDEX de Transact-SQL con la cláusula DROP EXISTING = ON.

  • Ejecute una secuencia de instrucciones ALTER PARTITION FUNCTION.

Todos los grupos de archivos que estén afectados por ALTER PARTITION FUNCTION deben estar en línea.

ALTER PARTITION FUNCTION produce un error cuando existe un índice clúster deshabilitado en cualquiera de las tablas que utilizan la función de partición.

SQL Server no proporciona compatibilidad de replicación para modificar una función de partición. Los cambios en la función de partición de la base de datos de publicaciones se deben aplicar manualmente en la base de datos de suscripciones.

Permisos

Se puede utilizar cualquiera de los siguientes permisos para ejecutar ALTER PARTITION FUNCTION:

  • Permiso ALTER ANY DATASPACE. Este permiso usa como valor determinado miembros del rol fijo de servidor sysadmin y de los roles fijos de base de datos db_owner y db_ddladmin.

  • Permiso CONTROL o ALTER en la base de datos en la que se ha creado la función de partición.

  • Permiso CONTROL SERVER o ALTER ANY DATABASE del servidor de la base de datos en la que se creó la función de partición.

Ejemplos

A. Dividir una partición de una tabla o índice con particiones en dos particiones

En el ejemplo siguiente se crea una función de partición para dividir una tabla o índice en cuatro particiones. ALTER PARTITION FUNCTION divide una de las particiones en dos para crear un total de cinco particiones.

IF EXISTS (SELECT * FROM sys.partition_functions
    WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Split the partition between boundary_values 100 and 1000
--to create two partitions between boundary_values 100 and 500
--and between boundary_values 500 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
SPLIT RANGE (500);

B. Mezclar dos particiones de una tabla con particiones en una partición

En el ejemplo siguiente se crea la misma función de partición que antes y después se mezclan dos de las particiones en una partición para conseguir un total de tres particiones.

IF EXISTS (SELECT * FROM sys.partition_functions
    WHERE name = 'myRangePF1')
DROP PARTITION FUNCTION myRangePF1;
GO
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );
GO
--Merge the partitions between boundary_values 1 and 100
--and between boundary_values 100 and 1000 to create one partition
--between boundary_values 1 and 1000.
ALTER PARTITION FUNCTION myRangePF1 ()
MERGE RANGE (100);