Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Le moyen le plus efficace de déplacer des lignes de table d'une table à une autre

Une autre solution consiste à utiliser plusieurs schémas et à jouer au switch-a-roo. Je préfère seulement cette méthode parce que j'avais l'habitude de faire cette astuce dans un travail, et le message d'avertissement concernant le renommage d'un objet (qui ne peut pas être supprimé) remplissait mes journaux d'historique. Fondamentalement, vous avez besoin de deux schémas supplémentaires (un pour conserver temporairement une copie de la table et un pour conserver la copie en cache).

CREATE SCHEMA cache AUTHORIZATION dbo;
CREATE SCHEMA hold  AUTHORIZATION dbo;

Maintenant, créez un mimique de la table dans le schéma de cache :

SELECT * INTO cache.table FROM dbo.table WHERE 1 = 0;
-- then create any indexes etc.

Maintenant, quand vient le temps d'actualiser les données :

-- step 1:
TRUNCATE TABLE cache.table;
-- (if you need to maintain FKs you may need to delete)
INSERT INTO cache.table SELECT ...

-- step 2:
-- this transaction will be almost instantaneous, 
-- since it is a metadata operation only: 

BEGIN TRANSACTION;
  ALTER SCHEMA hold  TRANSFER dbo.table;
  ALTER SCHEMA dbo   TRANSFER cache.table;
  ALTER SCHEMA cache TRANSFER hold.table;
COMMIT TRANSACTION;

Théoriquement, vous pourriez retirer le dernier transfert de la transaction, car les utilisateurs pourraient commencer à interroger la nouvelle copie de dbo.table après le deuxième transfert, mais comme je l'ai dit, c'est presque instantané donc je serais surpris si vous voyez une différence dans la simultanéité.

Vous pouvez également éventuellement tronquer cache.table encore une fois ici, mais je l'ai toujours gardé rempli afin que je puisse comparer les changements de données ou dépanner si quelque chose n'allait pas. Selon la durée de l'étape 1, il peut être plus rapide d'effectuer les transferts à l'envers que de recréer à partir de zéro.

Comme renommer, vous pouvez obtenir des choses bizarres à partir de ce processus, telles que des statistiques qui se perdent lorsqu'elles se déplacent avec la table réelle, elles ne collent pas avec le nom. Et comme renommer, vous voudrez tester cela et vous voudrez peut-être jouer avec les niveaux d'isolement, par ex. RCSI pour accéder au tableau de rapport.