Opération de Limite de Taille dans SQL Server
Je suis de chargement de grandes quantités de données à partir d'un fichier texte dans SQL Server. Actuellement, chaque enregistrement est inséré (ou mis à jour) dans une transaction distincte, mais cela laisse de la DB en mauvais état si un enregistrement échoue.
J'aimerais mettre tout cela en une grande transaction. Dans mon cas, je suis à la recherche d' ~de 250 000 insertions ou des mises à jour et peut-être ~1 000 000 de requêtes. Le fichier texte est à peu près de 60 mo.
Est-il déraisonnable de mettre l'ensemble de l'opération en une seule opération? Quel est le facteur limitant?
OriginalL'auteur bendytree | 2013-07-09
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas seulement de ne pas déraisonnable de le faire, mais c'est un must dans le cas où vous souhaitez préserver l'intégrité dans le cas où un enregistrement échoue, de sorte que vous obtenez un "tout ou rien", à l'importation comme vous le notez. 250000 des inserts ou des mises à jour seront pas un problème pour SQL pour gérer, mais je voudrais prendre un coup d'oeil à ce que sont ces millions de requêtes. Si ils ne sont pas nécessaires pour effectuer la modification de données, je les prendrais de la transaction, afin de ne pas ralentir l'ensemble du processus.
Vous avez à considérer que lorsque vous avez une transaction ouverte (indépendamment de la taille), les regards vont se produire sur les tables qu'il touche, et de longues opérations comme la vôtre pourrait provoquer le blocage dans les autres utilisateurs qui tentent de les lire en même temps. Si vous vous attendez à de l'import de gros et de temps et que le système sera sous la charge, envisager de faire l'ensemble du processus au cours de la nuit (ou la non-heures de pointe) pour atténuer l'effet.
Au sujet de la taille, il n'y a pas de limite de taille dans SQL Server, ils peuvent théoriquement modifier importe quelle quantité de données sans problèmes. La limite pratique est vraiment la taille du fichier journal des transactions de la base de données cible. Le moteur de base de tous les magasins temporaires et modifié des données dans ce fichier, alors que la transaction est en cours (il peut l'utiliser pour le restaurer si nécessaire), ce fichier va croître en taille. Il doit avoir suffisamment d'espace libre dans la base de données de propriétés, et assez d'espace disque pour le fichier de croître. Aussi, la ligne ou la table des verrous que le moteur sera mis sur les tables concernées consomme de la mémoire, de sorte que le serveur doit avoir suffisamment de mémoire libre pour tous ce de plomberie. De toute façon, 60 MO taille est souvent trop peu pour inquiéter en général. De 250 000 lignes est considérable, mais pas trop, de sorte que toute taille décente serveur sera capable de le gérer.
OriginalL'auteur Alejandro
SQL Server peut gérer ceux de la taille des transactions. Nous utilisons une seule opération de chargement en masse de plusieurs millions d'enregistrements.
La partie la plus coûteuse d'une opération de base de données est généralement le client-serveur de connexion et de trafic. Pour les insertions, mises à jour de l'indexation et de l'exploitation sont également coûteux, mais vous pouvez réduire les coûts en utilisant le bon de chargement techniques(voir ci-dessous). Vous voulez vraiment à la limite de la quantité de connexions et données transférées entre le client et le serveur.
À cette fin, vous devriez envisager de chargement en vrac les données avec SSIS ou C# avec SqlBulkCopy. Une fois que vous chargez en bloc tout, alors vous pouvez utiliser un ensemble d'opérations basées SUR LE SERVEUR pour mettre à jour ou vérifier vos données.
Prendre un coup d'oeil à cette question pour plus de suggestions sur l'optimisation des chargements de données. La question est liée à C#, mais beaucoup de l'information est utile pour SSIS ou d'autres méthodes de chargement. Quel est le moyen le plus rapide pour vrac insérer un grand nombre de données dans SQL Server, C# client) .
OriginalL'auteur kheld
Il n'y a pas de problème de faire un tout ou rien opération en bloc, à moins qu'une reprise complète est problématique pour votre entreprise. En fait, une seule opération est le comportement par défaut pour un grand nombre de bulk insert utilitaires.
Je conseille vivement contre une seule opération par ligne. Si vous voulez éliminer les mauvaises données, vous pouvez charger les données dans une table intermédiaire des première et pro grammaticalement déterminer "les données de mauvaise qualité" et ignorer les lignes.
OriginalL'auteur Adam Haines
Eh bien, personnellement, je ne charge pas les données importées directement à ma prod tables jamais et je les mauvaises herbes, tous les enregistrements qui n'est pas acceptable à long avant que j'ai jamais arriver au point de chargement. Certains types d'erreurs, de tuer l'importation complètement et d'autres peuvent tout simplement envoyer le dossier à une table d'exception à être renvoyés au fournisseur et fixe pour la prochaine charge. Généralement j'ai une logique qui détermine si il y a trop d'exceptions et tue le paquet.
Par exemple, supposons que la ville est un reuired dans votre base de données et dans le fichier de 1 000 000 d'enregistrements, vous avez dix qui n'ont pas de ville. Il est probablement préférable de les envoyer à une table d'exception et de charger le reste. Mais supposons que vous avez 357,894 dossiers, aucune ville. Ensuite, vous pourriez avoir besoin pour avoir une conversation avec le fournisseur de données pour obtenir les données fixes avant de le charger. Il va certainement affecter prod moins si vous pouvez déterminer que le fichier est inutilisable avant de vous essayez d'affecter la production des tableaux.
Aussi, pourquoi vous faites cela un seul enregistrement à la fois? Vous pouvez souvent aller beaucoup plus vite avec un traitement à base de jeu surtout si vous avez déjà réussi à nettoyer les données à l'avance. Maintenant, vous pouvez encore avoir besoin de faire des lots, mais un enregistrement à la fois peut être très lent.
Si vous voulez vraiment faire reculer l'ensemble de la chose, si une partie des erreurs, oui, vous avez besoin d'utiliser des transactions. Si vous faites cela dans la SSIS, alors vous pouvez mettre des transactions sur la partie de l'emballage où vous affecter prod tables et ne pas s'inquiéter à leur sujet dans la mise en scène des données et le nettoyage de pièces.
OriginalL'auteur HLGEM