Creo que esta sería una pregunta bastante simple, pero en realidad he tenido dificultades para encontrar una respuesta para esto.
La pregunta: ¿puede mover filas de datos dentro de una tabla particionada de una partición a otra simplemente actualizando la columna de partición para que cruce el límite de la partición?
Por ejemplo, si tengo una tabla que tiene una clave de partición:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Con la función de partición que se asigna a la clave primaria:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
¿Puedo mover una fila de la primera partición a la tercera partición cambiando el SampleID de 1 a (digamos) 500,000?
Nota: Estoy etiquetando esto como servidor SQL 2005 y 2008, ya que ambos admiten particiones. ¿Lo manejan de manera diferente?
$PARTITION
solo calcula el número de partición en función de la entrada; en realidad no prueba dónde vive físicamente la fila.Para probar esto, el experimento realmente necesita particionar la tabla. Ver http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
La consulta de la función de partición solo le dice lo que dice la función de partición. No dice dónde se almacenan los datos. Puede configurar una función de partición y ejecutarla sin particionar una tabla, como ya se ha demostrado aquí.
Para particionar la tabla, también debe crear grupos de archivos y un esquema de partición que use la función de partición para asignar resultados de función a grupos de archivos. Luego, debe colocar una clave agrupada en la tabla que utilice ese esquema de partición.
Configurar la partición
No soy experto en línea de comandos SQL. Utilicé la interfaz SSMS para configurar grupos de archivos pfg1 (con un archivo pf1) y pfg2 (con un archivo pf2). Luego declaró la función de partición y el esquema:
Crear la tabla y el índice agrupado
Después de hacer esto, cuando consulta sys.partitions (tengo 2005), ve que la tabla ahora tiene dos particiones en lugar de solo una para la tabla. Esto indica que hemos implementado completamente la partición para esta tabla.
Ahora que tenemos dos particiones (con un recuento de filas para cada una), podemos realizar un experimento.
Insertar las filas
Consulte las particiones sys. para ver qué sucedió.
Sí. Una fila en cada partición.
Mueve una fila.
Verifica las particiones
La primera partición ahora tiene dos filas en lugar de 1, y la segunda partición tiene cero filas en lugar de dos.
Creo que esto confirma que la fila se movió automáticamente como resultado de modificar la clave agrupada en una tabla particionada.
fuente
No creo que esa respuesta sea correcta. Cuando usas el valor
simplemente está recalculando cuál debería ser la partición, no dónde está actualmente el registro.
Deberías usar:
En mis pruebas en SQL 2005, el valor cambia pero el registro permanece en la misma partición. Esto probablemente alterará las estadísticas y el optimizador, ya que se ejecutará en un modo de subprocesos múltiples esperando que una partición esté en un rango específico. También será completamente incorrecto cuando intente utilizar la eliminación de la partición para consultar solo la partición relevante. Creo que debe eliminar y volver a insertar cada registro para que se muevan.
fuente
$partition
aquí sugiere que la respuesta aceptada es correcta. ¿Cómo confirma que el registro permanece en la misma partición después de haber sido actualizado?