2010-03-13 50 views
48

Tengo SQL Server 2008 Ent y la base de datos OLTP con dos tablas grandes. ¿Cómo puedo mover estas tablas a otro grupo de archivos sin interrumpir el servicio? Ahora, se insertaron entre 100 y 130 registros y 30 a 50 registros actualizados cada segundo en estas tablas. Cada tabla tiene aproximadamente 100 millones de registros y seis campos (incluida una geografía de campo).¿Cómo puedo mover la tabla a otro grupo de archivos?

Estoy buscando una solución a través de google, pero todas las soluciones contienen "crear una segunda tabla, insertar filas de la primera tabla, soltar la primera tabla, bla bla bla".

¿Puedo usar funciones de particionamiento para resolver este problema? Gracias.

Respuesta

61

Si solo desea mover la tabla a un nuevo grupo de archivos, debe volver a crear el índice agrupado en la tabla (después de todo: el índice agrupado es los datos de la tabla) en el nuevo grupo de archivos que desea.

Usted puede hacer esto con, por ejemplo:

CREATE CLUSTERED INDEX CIX_YourTable 
    ON dbo.YourTable(YourClusteringKeyFields) 
    WITH DROP_EXISTING 
    ON [filegroup_name] 

o si su índice agrupado es única:

CREATE UNIQUE CLUSTERED INDEX CIX_YourTable 
    ON dbo.YourTable(YourClusteringKeyFields) 
    WITH DROP_EXISTING 
    ON [filegroup_name] 

Esto crea un nuevo índice agrupado y soltar la ya existente, y crea el nuevo índice agrupado en el grupo de archivos que especificó; et voila, los datos de su tabla se han movido al nuevo grupo de archivos.

Consulte el MSDN docs on CREATE INDEX para obtener detalles sobre todas las opciones disponibles que desee especificar.

Esto, por supuesto, sin embargo, no trata de partioning, pero eso es otra historia para ella sola ...

+0

Esta es la sintaxis compatible con versiones anteriores: OP está usando SQL Server 2008. Y una descarada eliminación/actualización – gbn

+5

Bien mierda en un cringle ... Acabo de pasar más tiempo del que me importa admitir tratando de averiguar por qué la tabla que creé en FILEGROUP2 siguió yendo a FILEGROUP1 ... es porque PK estaba en FG1 'create table (... constraint (...) en FG1) ON FG2' - FG1 tenía prioridad. Gracias por esto. – WernerCD

+1

No todas las tablas son índices agrupados. Acabo de navegar desde Google e intento encontrar la misma información para montones. – Paul

7

partición es una solución, pero que podría "mover" el índice agrupado al nuevo grupo de archivos con sin interrupción del servicio (sujeto a algunas condiciones, ver enlace abajo) utilizando

CREATE CLUSTERED /*oops*/ INDEX ... WITH (DROP_EXISTING = ON, ONLINE = ON, ...) ON newfilegroup 

el índice agrupado es los datos y esto es lo mismo que el grupo de archivos en movimiento.

favor ver CREATE INDEX

Esto depende de si su clave primaria está agrupado o no, que cambia la forma en que lo haríamos

+0

y tendría que especificar 'CREATE * CLUSTERED * INDEX .....' para mover realmente los datos, ¿no? :-) –

+2

Sí. Y los dos estamos equivocados si la restricción PK está agrupada ... – gbn

0

Creo que estos pasos son muy simples y recta hacia adelante para mover a cualquier mesa un grupo diferente de archivos (a través de Management Studio):

  • mover todos los índices no agrupados a un nuevo grupo de archivos simplemente cambiando la propiedad por cada grupo de archivos índices

  • Cambiar su índice de clúster para no agrupado y cambiar su grupo de archivos simple (como el paso anterior)

  • Añadir un nuevo índice de agrupación temporal con "nuevo grupo de archivos" a través de este comando (o vía IDE) :

    CREATE CLUSTERED INDEX [PK_temp] 
    ON YOURTABLE([Id]) 
        ON NEWFILEGROUP 
    

    (el comando anterior hace que se desplacen todos los datos al nuevo grupo de archivos)

  • Eliminar el PK temporal por encima

  • (cuando lo hace su trabajo prefectamenta!)
  • cambiar de nuevo su índice principal clúster que se van índice de agrupación de nuevo (a través del IDE de nuevo)

El beneficio de los pasos anteriores no se tenga que soltar las relaciones FK existentes. Además, el uso de IDE evita la pérdida de datos en condiciones de error.

NOTA: asegúrese de que la cuota de disco no esté habilitada para su grupo de archivos o configúrelo de forma incorrecta. De lo contrario, obtienes tu excepción de "grupo de archivos completo".

2

Este extracto de libros en pantalla de lo dice todo: "Debido a que el nivel de hoja de un índice agrupado y las páginas de datos son los mismos, por definición, la creación de un índice agrupado y con el partition_scheme_name ON o de ON filegroup_name cláusula mueve con eficacia una tabla del grupo de archivos en el que se creó la tabla para el nuevo esquema de partición o grupo de archivos. " (Fuente - http://msdn.microsoft.com/en-us/library/ms188783.aspx) a partir de (http://www.mssqltips.com/sqlservertip/2442/move-data-between-sql-server-database-filegroups/)

como ya se ha dicho por otros amigos como respuesta aceptada por los siguientes marc_s es la pantalla le da otra manera de hacerlo utilizando SSMS interfaz gráfica de usuario.

tenga en cuenta que se puede mover a otro grupo de archivos fácilmente de la propiedad de índice en la ficha de almacenamiento enter image description here

16

Para responder a esta pregunta, primero hay que entender

  • Si una tabla no tiene un índice , sus datos se llaman montón
  • Si una tabla tiene un índice agrupado, ese índice es efectivamente su tabla de datos. Por lo tanto, si mueve el índice agrupado, también moverá sus datos.

El primer paso es obtener más información acerca de la tabla que queremos mover.Hacemos esto mediante la ejecución de este T-SQL: 'Data_located_on_filegroup'

sp_help N'<<your table name>>' 

La salida le mostrará una columna titulada Esta es una forma útil de saber en qué grupo de archivos se encuentran los datos de su tabla. Pero más importante es el resultado que muestra información sobre los índices de la tabla. (Si solo desea ver información sobre los índices de tabla, simplemente ejecute sp_helpindex N'<<your table name>>'). Su tabla puede tener 1) ningún índice (por lo tanto, es un montón), 2) un solo índice o 3) índices múltiples. Si index_description comienza con 'clustered, unique, ...', ese es el índice que desea mover. Si el índice también es una clave principal, eso está bien, aún puede moverlo.

Para mover el índice, hacer una nota de la index_name y index_keys se muestra en los resultados de la consulta de ayuda anterior, luego usarlos para rellenar el <<blanks>> en la siguiente consulta:

CREATE UNIQUE CLUSTERED INDEX [<<name of clustered index>>] 
ON [<<table name>>]([<<column name the index is on - from index_keys above>>]) 
WITH DROP_EXISTING, ONLINE 
ON <<name of file group you want to move the index to>> 

Los DROP EXISTING, ONLINE opciones arriba son importantes. DROP EXISTING se asegura de que el índice no esté duplicado, y ONLINE mantiene la tabla en línea mientras la está moviendo.

Si el índice se está moviendo es no un índice agrupado, luego vuelva a colocar por encima de UNIQUE CLUSTERED con NONCLUSTERED

Para mover una tabla de montón, agregue un índice agrupado a la misma, a continuación, ejecute la instrucción anterior para moverlo a un grupo de archivos diferente, luego suelte el índice.

Ahora, regrese y ejecute sp_help en su tabla, y verifique los resultados para ver dónde se encuentran ahora su tabla y datos de índice.

Si la tabla tiene más de un índice, a continuación, después de ejecutar la instrucción anterior para mover el índice agrupado, sp_helpindex mostrará que su índice agrupado está en el nuevo grupo de archivos, pero los índices restantes todavía habrá en el grupo de archivos original. La tabla continuará funcionando normalmente, pero debería tener una buena razón por la que desea que los índices se encuentren en diferentes grupos de archivos. Si desea que la tabla y todos sus índices estén en el mismo grupo de archivos, repita las instrucciones anteriores para cada índice, sustituyendo CREATE [NONCLUSTERED, or other] ... DROP EXISTING... según sea necesario, según el tipo de índice que esté moviendo.

+0

Aquí hay buena información sobre cómo mover datos no agrupados. – Rots

0
CREATE CLUSTERED INDEX IXC_Products_Product_id 
ON dbo.Products(Product_id) 
WITH (DROP_EXISTING = ON) ON MyNewFileGroup 
1

¿Cómo puedo mover la tabla a otro grupo de archivos?

NOTA: Mover una tabla a otro grupo de archivos solo funciona con Enterprise Edition.

Paso 1:

Comprobar en qué tabla de grupo de archivos resida:

-- Query to check the tables and their current filegroup: 

SELECT tbl.name AS [Table Name], 
      CASE WHEN dsidx.type='FG' THEN dsidx.name ELSE '(Partitioned)' END AS [File Group] 
FROM  sys.tables AS tbl 
JOIN  sys.indexes AS idx 
ON  idx.object_id = tbl.object_id 
AND  idx.index_id <= 1 
LEFT JOIN sys.data_spaces AS dsidx 
ON  dsidx.data_space_id = idx.data_space_id 
ORDER BY [File Group], [Table Name] 

Paso 2:

mover una mesa/mesas existentes para t El nuevo Filegroup

Si el grupo de archivos al que desea mover la tabla no existe aún, cree el grupo de archivos secundario y luego mueva la tabla.

Mover una tabla a un grupo de archivos diferente implica mover el índice agrupado de la tabla al nuevo grupo de archivos. El nivel de la hoja del índice agrupado realmente contiene los datos de la tabla. Así moviendo el índice agrupado se puede hacer en una sola instrucción utilizando la cláusula DROP_EXISTING como sigue:

CREATE UNIQUE CLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName] 
(
    [ClusteredIndexKeyFields] 
)WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName] 
GO 

Paso 3:

Mover los restantes índices de no agrupado a grupo de archivos secundario

Tienes que mover los índices no agrupados manualmente mediante la sintaxis que se menciona a continuación:

--1st check the index information using the following sp 
sp_helpindex [YourTableName] 


--Now by using the following query you can move the remaining indexes to secondary filegroup 
CREATE NONCLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName] 
(
    [IndexKeyFields] 
)WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName] 
GO 

Mover un montón a otro grupo de archivos:

Como sé que la única manera de mover el montón a otro grupo de archivos es agregar temporalmente un índice agrupado en el nuevo grupo de archivos y luego dejarla caer (si es necesario).

+0

Referencia para mover una tabla a otro grupo de archivos: https://msdn.microsoft.com/en-us/library/ms175905.aspx –

+0

http://www.sqlpassion.at/archive/2016/09/26/how- to-move-data-between-file-groups-in-sql-server / –

Cuestiones relacionadas