Bulk Insert de la table à la table
Je me suis mise en œuvre d'un A/B/Vue scénario, ce qui signifie que le Vue points de table Un, tandis que tableau B est mis à jour, une modification se produit et les points de vue à la table B, alors que le tableau A est chargé.
La commutation se produit tous les jours. Il y a des millions de lignes à mettre à jour et à des milliers d'utilisateurs regardant la vue. Je suis sur SQL Server 2012.
Mes questions sont:
- comment puis-je insérer des données dans une table à partir d'une autre table le plus rapidement possible? (à l'intérieur d'une procédure stockée)
- Est-il possible d'utiliser l'instruction BULK INSERT? Ou, en utilisant un insert/select de la manière la plus rapide d'aller?
OriginalL'auteur user1044169 | 2012-06-19
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire la
que quelques réponses suggèrent, qui devrait être aussi rapide qu'il le peut (en fonction du nombre d'indices, vous aurez besoin de recréer, etc).
Mais je conseille synonymes afin de changer le pointeur d'un tableau à l'autre. Ils sont très transparents et à mon avis, plus propre que la mise à jour de la vue ou de renommer les tables.
SELECT *
type de fonctionnalité, synonymes serait plus efficace. Ils sont très utiles pour la croix-base de données de références, trop.En fait, j'ai peut-être pour coller à la vue parce que les vues permettent de MODIFIER la fonctionnalité des synonymes besoin d'être supprimé et recréé.
Cette méthode n'est pas bulk insert et générer beaucoup de journaux
OriginalL'auteur Sylvia
Vous à Sélectionner ColA, colb ne en DestTable_New De SrcTable. Une fois DestTable_New est chargé, de recréer les index et les contraintes.
Puis renommez DestTable à DestTable_Old et renommer DestTable_New à DestTable. Le renommage est extrêmement rapide. Si quelque chose semble avoir mal tourné, vous disposez d'une sauvegarde de la table précédente, à proximité, DestTable_Old).
J'ai fait ce scénario une fois où nous avons eu d'avoir le système de fonctionnement 24/7 et nécessaires pour le chargement des dizaines de millions de lignes chaque jour.
OriginalL'auteur Asok
INSERT... SELECT...
fonctions assez similaire àBULK INSERT
. Vous pouvez utiliser SSIS, comme @GarethD dit, peut-être trop complexe si vous êtes juste en copiant les lignes de la table table1 à la table2.Si vous copiez sérieux quantités de données, gardez un œil sur le journal des transactions, il peut gonfler très vite quand on fait d'énormes insertions. Une façon de contourner ce est de "chunkify" les données que vous insérez, par boucler sur un insert de tresorerie que les processus, par exemple, que 100 000 ou 10 000 lignes de temps (dépend de la largeur des lignes est, c'est à dire combien de MO par passer).
(Juste par curiosité, tu fais
ALTER VIEW
pour rétablir la vue? J'ai fait quelque chose de similaire une fois, même si nous avons eu quatre tables et les quatre points de vue à l'appui de passé/présent/suivant/swap ensembles.)J'ai retirer ce -- points de vue semblent être une meilleure option, car ils fournissent pour MODIFIER la fonctionnalité des synonymes sont limitées à drop/create.
OriginalL'auteur Philip Kelley
Je serais enclin à utiliser SSIS.
Faire de la table Un OLEDB, la source et le tableau B OLEDB destination. Vous pourrez contourner le journal des transactions, afin de réduire la charge sur la DB. La seule façon (je pense) pour ce faire à l'aide de T-SQL est de changer le modèle de récupération pour l'ensemble de votre base de données, ce qui est loin d'être idéale, car cela signifie pas de transactions sont stockées, et pas seulement ceux de votre transfert.
Configuration SSIS Transfert
Créer un nouveau projet et faites-le glisser une tâche de flux de données pour la conception de votre surface
Double-cliquez sur votre tâche de flux de données qui vous mènera à travers l'onglet Flux de Données. Puis faites glisser et déposez une source OLE DB à partir de "Sources de flux de Données" dans le menu, et une destination OLE DB à partir de la "Destinations de flux de Données" du menu
Double-cliquez sur la source de données OLE DB, la connexion à votre serveur, sélectionnez la table que vous souhaitez charger et cliquez sur OK. Faites glisser la flèche verte à partir de l'OLE DB source à la destination, puis double-cliquez sur la destination. Configurer votre gestionnaire de connexion, destination nom de la table et les mappages de colonnes et vous devriez être bon d'aller.
Source OLE DB docs sur MSDN
Destination OLE DB docs sur MSDN
OriginalL'auteur GarethD
Vous pouvez simplement faire comme ceci
Ce doit sélectionner les données à partir de B, sur la base des critères et de l'insérer dans Un, à condition que les colonnes sont les mêmes ou vous pouvez spécifier des noms de colonnes au lieu de *.
s'il vous plaît aller à travers la question encore une fois, l'utilisateur a demandé le moyen le plus rapide pour insérer des données d'une table à une autre, indépendamment de la simple sql, bulk insert, journal des transactions de la maintenabilité des questions.
Je n'étais pas celui qui downvoted votre réponse, mais des millions de lignes dans un système de production pourrait causer BEAUCOUP de verrouillage et de blocage basé sur le niveau d'isolement et de matériel. Que pourrait prendre un temps très long. Un select * into a à partir de b serait la réponse la plus simple mais pas le plus rapide.
OriginalL'auteur Furqan Hameedi
Je sais que la question est vieille, mais j'ai été à la chasse pour la réponse à la même question, et n'ai rien trouvé de vraiment utile. Oui SSIS approche est une possibilité, mais la question se voulait une procédure stockée.
À mon grand bonheur, j'ai découvert (presque) la solution de la question d'origine voulu; vous pouvez le faire avec un CLR SP.
Sélectionner les données de la TableA dans un DataTable et ensuite utiliser le WriteToServer(DataTable dt) méthode de la SqlBulkCopy classe avec TableB comme le DestinationTableName.
Le seul petit inconvénient est que le CLR procédure doit utiliser l'accès externe afin d'utiliser SqlBulkCopy, et ne fonctionne pas avec le contexte de connexion, de sorte que vous besoin de jouer un peu avec les autorisations et les chaînes de connexion. Mais hey! rien n'est jamais parfait.
OriginalL'auteur