Lot de s'engager sur la grande opération d'INSERTION dans SQL natif?
J'ai un couple de grandes tables (188 m et 144m lignes) j'ai besoin de remplir à partir de points de vue, mais chaque vue contient quelques centaines de millions de lignes (extraction de l'ensemble des pseudo-dimensions de la modélisation des données dans un formulaire plat). Les touches sur chaque table sont plus de 50 composite octets de colonnes. Si les données dans les tables, je pensais toujours à propos de l'utilisation de sp_rename pour faire l'autre table, mais ce n'est pas vraiment une option.
Si je fais une seule opération d'INSERTION, le processus utilise une énorme quantité d'espace du journal des transactions, typicalyl de dépôt et en invitant un tas de tracas avec les Administrateurs de bases de données. (Et oui, c'est probablement un travail les Administrateurs de base de données doit gérer/conception/architecte)
Je peux utiliser SSIS et diffuser les données dans la table de destination avec la validation du lot (mais cela ne veut exiger la transmission des données par le réseau, car nous ne sommes pas autorisés à exécuter des packages SSIS sur le serveur).
Toutes les autres choses que de diviser le processus en plusieurs opérations d'INSERTION à l'aide de une sorte de clé pour distribuer les lignes dans les différents lots et faire une boucle?
- Si la table de partitionnement est une option, vous pouvez diviser les inserts par la partition de la valeur. Pourrait la rendre plus rapide à assembler résultant des sous-ensembles.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez partitionner vos données et insérez vos données dans un curseur de la boucle. Ce serait presque la même que SSIS batchinserting. Mais s'exécute sur votre serveur.
Ne l'ont pas vue sur TOUT type d'identificateur unique /candidat à la clé? Si oui, vous pouvez sélectionner les lignes dans une table de travail à l'aide de:
(Si il est logique, peut-être mettre cette table dans une autre base de données, peut-être avec le modèle de récupération SIMPLE, pour empêcher le journal de l'activité d'interférer avec votre base de données primaire. Cela devrait générer beaucoup moins de journaux de toute façon, et vous pouvez libérer de l'espace dans l'autre base de données avant de reprendre, dans le cas où le problème est que vous avez un manque d'espace disque tout autour.)
Ensuite, vous pouvez faire quelque chose comme cela, l'insertion de 10 000 lignes à la fois, et de sauvegarder le journal entre:
C'est tout en haut de ma tête, afin de ne pas couper/coller/exécuter, mais je pense que l'idée générale est là.
Noter que si vous prenez de base de données régulièrement des sauvegardes des journaux et vous aurez probablement envie de prendre plein de commencer votre journal de la chaîne une fois de plus.
SET @ctr = @ctr + 1
dans la boucle pour incrémenter le numéro de lot du compteur. J'espère que vous n'avez pas l'esprit - j'ai édité (après essais les résultats).Je sais que c'est un vieux thread, mais j'ai fait une version générique de Arthur curseur solution:
Cela a résolu le problème sur les charges de nos grandes tables.
Il n'y a pas de poussière de lutin, tu le sais.
Sans connaître les détails au sujet de la réelle schéma de transfert, une solution générique serait exactement comme vous le décrire: fracture de la transformation en multiples insertions et de garder trace de la clé(s). C'est une sorte de pseudo-code T-SQL:
Il aurait plus compliqué si vous souhaitez autoriser parallèle lots et partition les touches.
Vous pouvez utiliser la commande BCP pour charger les données et l'utilisation de la Taille de Lot paramètre
http://msdn.microsoft.com/en-us/library/ms162802.aspx
Processus en deux étapes
Cela ressemble à un travail pour de bon ol' BCP.