web-dev-qa-db-fra.com

Comment puis-je déplacer la table vers un autre groupe de fichiers?

J'ai SQL Server 2008 Ent et la base de données OLTP avec deux grandes tables. Comment puis-je déplacer ces tables vers un autre groupe de fichiers sans interruption du service? Maintenant, environ 100 à 130 enregistrements insérés et 30 à 50 enregistrements sont mis à jour chaque seconde dans ce tableau. Chaque table contient environ 100 millions d'enregistrements et six champs (y compris une zone géographique).

Je cherche une solution via google, mais toutes les solutions contiennent "créer un deuxième tableau, insérer des lignes du premier tableau, déposer le premier tableau, bla bla bla".

Puis-je utiliser des fonctions de partitionnement pour résoudre ce problème? Je vous remercie.

54
user272887

Si vous souhaitez simplement déplacer la table vers un nouveau groupe de fichiers, vous devez recréer l'index en cluster sur la table (après tout: l'index en cluster est les données de la table) sur le nouveau groupe de fichiers souhaité.

Vous pouvez le faire avec, par exemple:

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

ou si votre index clusterisé est unique:

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

Cela crée un nouvel index en cluster et supprime l'existant, et crée le nouvel index en cluster dans le groupe de fichiers que vous avez spécifié - et le tour est joué, vos données de table ont été déplacées vers le nouveau groupe de fichiers.

Consultez la documentation relative à MSDN sur CREATE INDEX pour plus de détails sur toutes les options disponibles que vous souhaitez spécifier.

Bien sûr, cela ne concerne pas encore le partitionnement, mais c'est une toute autre histoire à part entière ...

70
marc_s

Pour répondre à cette question, il faut d'abord comprendre

  • Si une table n'a pas d'index, ses données sont appelées un tas
  • Si une table a un index clusterisé, cet index est effectivement vos données de table. Par conséquent, si vous déplacez l'index clusterisé, vous déplacerez également vos données.

La première étape consiste à obtenir plus d'informations sur la table que nous souhaitons déplacer. Nous faisons cela en exécutant ce T-SQL:

sp_help N'<<your table name>>'

La sortie vous montrera une colonne intitulée 'Data_located_on_filegroup.' C'est un moyen pratique de savoir sur quel groupe de fichiers se trouvent vos données de table. Mais le plus important est la sortie qui vous montre des informations sur les index de la table. (Si vous souhaitez uniquement afficher des informations sur les index de table, exécutez simplement sp_helpindex N'<<your table name>>') Votre table peut comporter 1) aucun index (il s'agit donc d'un tas), 2) un seul index ou 3) plusieurs index. Si index_description commence par 'clustered, unique, ...', il s'agit de l'index que vous souhaitez déplacer. Si l'index est également une clé primaire, vous pouvez toujours le déplacer. 

Pour déplacer l'index, notez les noms_index et index_keys affichés dans les résultats de la requête d'aide ci-dessus, puis utilisez-les pour renseigner le <<blanks>> dans la requête suivante:

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>>

Les options DROP EXISTING, ONLINE ci-dessus sont importantes. DROP EXISTING s'assure que l'index n'est pas dupliqué et ONLINE maintient la table en ligne pendant que vous la déplacez.

Si l'index que vous déplacez est pas un index en cluster, remplacez UNIQUE CLUSTERED ci-dessus par NONCLUSTERED

Pour déplacer une table de segment, ajoutez-y un index clusterisé, puis exécutez l'instruction ci-dessus pour le déplacer vers un autre groupe de fichiers, puis supprimez l'index.

Maintenant, retournez et exécutez sp_help sur votre table et vérifiez les résultats pour voir où se trouvent maintenant vos données de table et d’index.

Si votre table a plusieurs index , après avoir exécuté l'instruction ci-dessus pour déplacer l'index en cluster, sp_helpindex indiquera que votre index en cluster se trouve sur le nouveau groupe de fichiers, mais les index restants le seront toujours. . La table continuera à fonctionner normalement, mais vous devriez avoir une bonne raison pour laquelle vous souhaitez que les index soient situés dans des groupes de fichiers différents. Si vous souhaitez que la table et tous ses index se trouvent dans le même groupe de fichiers, répétez les instructions ci-dessus pour chaque index, en remplaçant le code CREATE [NONCLUSTERED, or other] ... DROP EXISTING... si nécessaire, en fonction du type d'index que vous déplacez.

23
Baodad

Le partitionnement est une solution, mais vous pouvez "déplacer" l'index clusterisé vers le nouveau groupe de fichiers sans interruption de service (sous réserve de certaines conditions, voir le lien ci-dessous) en utilisant

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

L'indice en cluster est les données, ce qui revient au déplacement d'un groupe de fichiers.

Veuillez voir CREATE INDEX

Cela dépend si votre clé primaire est en cluster ou non, ce qui change la façon dont nous le ferions

7
gbn

Cet extrait de la documentation en ligne de SQL Server dit tout: "Parce que le niveau feuille d'un index en cluster et les pages de données sont identiques, la création d'un index en cluster et l'utilisation de la clause ON partition_scheme_name ou ON filegroup_name déplace effectivement une table de le groupe de fichiers sur lequel la table a été créée dans le nouveau schéma de partition ou groupe de fichiers. " (Source - http://msdn.Microsoft.com/en-us/library/ms188783.aspx ) à partir de ( http://www.mssqltips.com/sqlservertip/2442/move-data-between -sql-server-database-filegroups/ )

comme déjà dit par d'autres amis comme réponse acceptée par marc_s ci-dessous est la capture d'écran vous donne une autre façon de le faire en utilisant SSMS GUI.

veuillez noter que vous pouvez facilement déplacer un autre groupe de fichiers de la propriété index dans l'onglet de stockage enter image description here

2
Iman Abidi

Veuillez noter que la recréation de l'index clusterisé ne déplace que les colonnes "primitives", telles que int, bit, datetime etc.

Pour déplacer les colonnes varchar(max), varbinary et les autres colonnes "blob", vous devez recréer la table. Heureusement, il est possible de le faire de manière semi-automatique dans SSMS - en modifiant le "groupe de fichiers texte" dans la fenêtre "Conception" du tableau, puis en enregistrant les modifications.

J'ai blogué à ce sujet ici: https://www.jitbit.com/alexblog/153-moving-sQL-table-textimage-to-a-nene-filegroup/ si vous souhaitez plus de détails.

2
Alex

Comment puis-je déplacer la table vers un autre groupe de fichiers?

REMARQUE: Le déplacement d'une table vers un autre groupe de fichiers ne fonctionne qu'avec Enterprise Edition.

Étape 1 :  

Vérifiez sur quelle table de groupe de fichiers réside:

-- 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] 

Étape 2 :

Déplacer une table/des tables existantes vers le nouveau groupe de fichiers

Si le groupe de fichiers vers lequel vous souhaitez déplacer la table n’existe pas, créez-le, puis déplacez-le.

Déplacer une table vers un autre groupe de fichiers implique de déplacer l’index clusterisé de la table vers le nouveau groupe de fichiers. Le niveau feuille de l'index clusterisé contient en réalité les données de la table. Le déplacement de l'index clusterisé peut donc être effectué dans une seule instruction à l'aide de la clause DROP_EXISTING comme suit:

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

Étape 3:  

Déplacer les index non-cluster restants vers le groupe de fichiers secondaire

Vous devez déplacer manuellement les index non-cluster en utilisant la syntaxe mentionnée ci-dessous:

--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

Déplacer un segment de mémoire vers un autre groupe de fichiers:

Comme je le sais, le seul moyen de déplacer le segment de mémoire vers un autre groupe de fichiers consiste à ajouter temporairement un index en cluster sur le nouveau groupe de fichiers, puis à le supprimer (si nécessaire).

1
Kundan Dasange

Je pense que ces étapes sont très simples et directes pour déplacer n’importe quelle table dans un groupe de fichiers différent (via Management Studio):

  • Déplacez tous les index non clusterisés vers un nouveau groupe de fichiers en modifiant simplement la propriété De la propriété FileGroup pour chaque index.

  • Changez votre index de cluster en non-cluster et changez simplement son groupe de fichiers (comme à l'étape précédente)

  • Ajoutez un nouvel index de cluster temporaire avec "nouveau groupe de fichiers" via cette commande (ou via IDE):

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

    (la commande ci-dessus provoque le déplacement de toutes les données dans un nouveau groupe de fichiers)

  • Supprimer la PK temporaire ci-dessus (quand elle fait son travail correctement!)

  • Remettez de nouveau votre index de cluster principal en index de cluster (via IDE à nouveau)

L'avantage des étapes ci-dessus n'est pas nécessaire de supprimer les relations FK existantes. L'utilisation de IDE empêche également la perte de données en cas d'erreur. 

REMARQUE: assurez-vous que le quota de disque n'est pas activé pour votre groupe de fichiers ou définissez-le correctement. Sinon, vous obtenez une exception "groupe de fichiers est complet"!

0
Mahmoud Moravej
CREATE CLUSTERED INDEX IXC_Products_Product_id
ON dbo.Products(Product_id)
WITH (DROP_EXISTING = ON) ON MyNewFileGroup
0
Sanjay Aswani