web-dev-qa-db-fra.com

Y a-t-il un écart entre "ROW PER BATCH" et "MAX INSERT COMMIT SIZE" DANS LES PAQUETS SSIS?

J'ai un paquet SSIS qui exporte 2,5 Go de données contenant 10 millions d'enregistrements dans la base de données SQL Server, qui contient 10 partitions, dont le groupe de fichiers PRIMARY FILE GROUP.

Avant de modifier la valeur par défaut Taille d'insertion max. D'insertion i.e. "2147483647" et Ligne par lot . La transformation terminée avec l'option de chargement rapide prenait 7 minutes.

Mais après avoir modifié une valeur décente avec une formule, l’exécution s’est faite en seulement 2 minutes.

FYI- DefaultMaxBufferRows & DefaultMaxBufferSize étaient la valeur par défaut dans les deux scénarios, à savoir 10 000 et 10 Mo respectivement.

Pour calculer Taille d'insertion max. D'insertion & Ligne par lot Les calculs ci-dessous sont utilisés.

1) Longueur calculée des enregistrements de la source en cours de transfert. qui vient autour de 1038 octets.

CREATE TABLE [dbo].[Game_DATA2](
    [ID] [int] IDENTITY(1,1) NOT NULL, -- AUTO CALCULATED
    [Number] [varchar](255) NOT NULL, -- 255 bytes
    [AccountTypeId] [int] NOT NULL, -- 4 bytes
    [Amount] [float] NOT NULL,-- 4 bytes
    [CashAccountNumber] [varchar](255) NULL, -- 255 bytes
    [StartDate] [datetime] NULL,-- 8 bytes
    [Status] [varchar](255) NOT NULL,-- 255 bytes
    [ClientCardNumber] [varchar](255) NULL -- 255 bytes
)

2) Lignes par lot = taille_packate/octets par enregistrement = 32767/1038 = 32 environ.

3) Taille de validation d'insertion maximale = taille du paquet * nombre de transaction = 32767 * 100 = 3276700 (la taille du paquet et la transaction numérique sont variables peuvent changer selon les besoins)

Question:

  • Existe-t-il une pertinence des lignes par lot et de la taille de validation d'insertion maximale? Comme il n'y a aucune information mentionnée dans une archive article pour le réglage de l'exécution DFT (DATA FLOW TASK).

  • Ces configurations fonctionnent-elles avec DefaultBuffermaxzie et
    DefualtBuffermaxrows? Si oui comment?

4

Ces paramètres font référence à DFT OLE Destination DB uniquement. OLE _ La destination de base de données émet une commande insert bulk. Ces deux paramètres le contrôlent de la manière suivante: 

  • Taille d'insertion maximum d'insertion - contrôle la quantité de données insérée dans un seul lot. Ainsi, si vous avez défini MICS sur 5 000 et que vous avez 9 000 lignes et que vous rencontrez une erreur dans les 5 000 premiers résultats, la totalité du lot de 5 000 sera annulée. MISC correspond à l'argument BATCHSIZE de la commande BULK INSERT transact-sql. 
  • Lignes par lot - indique simplement l'optimiseur de requêtes. La valeur de this doit être définie sur le nombre réel de lignes attendu. RPB correspond à l'argument ROWS_PER_BATCH de la commande BULK INSERT transact-sql.
    Spécifier une valeur pour le MICS aura quelques effets. Chaque lot est copié dans le journal des transactions, ce qui entraîne une croissance rapide, mais offre la possibilité de sauvegarder ce journal de transaction après chaque lot. En outre, un lot volumineux affectera négativement la mémoire si vous avez des index sur la table cible et si vous n'utilisez pas le verrouillage de table, des blocages supplémentaires risquent de se produire. 

BULK INSERT (Transact-SQL) - Article MS sur cette commande.

DefaultBuffermaxsize et DefaultBuffermaxrows contrôle RAM la gestion de la mémoire tampon à l'intérieur de la DFT elle-même et n'interfère pas avec les options mentionnées ci-dessus.

5
Ferdipux

Cher Harsimranjeet Singh,

Sur la base de mon expérience personnelle, Rows_Per_Batch détermine le nombre de lignes par lot que oledb_destination doit recevoir du composant DFT alors que DefualtBuffermaxrows détermine la taille de la bacth de DFT. Par conséquent, DefualtBuffermaxrows dépend des spécifications du serveur SSIS et Rows_Per_Batch dépend de chaque serveur de destination. définir avec leurs conditions. 

Aussi, Maximum_Insert_Commit_Size détermine le nombre d'enregistrements lorsqu'il atteint le nombre, puis écrit dans le fichier journal et le valide; En diminuant ce nombre, le nombre de références à log augmente, ce qui est grave, mais MSDB (base de données système) ne gonfle pas et est très utile pour augmenter les performances.

Un autre point est la relation entre DefualtBuffermaxrows et DeafultBufferSize, qui doit être définie ensemble. Les multiplications DefualtBuffermax par la taille de chaque enregistrement doivent être approximativement égales à DeafultBufferSize. Si cette taille est supérieure, réduisez-la pour atteindre cet objectif et si elle est inférieure et inférieure à la taille minimale de la mémoire tampon, augmentez-la pour atteindre la taille minimale de la mémoire tampon. Ces opérations réduisent sérieusement les performances de votre paquet.

Bonne chance!

1
Saeid Yousefi

Lignes par lot - La valeur par défaut de ce paramètre est -1, ce qui indique que toutes les lignes entrantes seront traitées comme un seul lot. Vous pouvez modifier ce comportement par défaut et fractionner toutes les lignes entrantes en plusieurs lots. La valeur autorisée est uniquement un entier positif spécifiant le nombre maximal de lignes d'un lot.

Taille d'insertion maximum - La valeur par défaut de ce paramètre est '2147483647' (la plus grande valeur pour le type entier sur 4 octets) spécifiant que toutes les lignes entrantes seront validées une fois l'opération terminée. Vous pouvez spécifier une valeur positive pour ce paramètre pour indiquer que la validation sera effectuée pour ce nombre d'enregistrements. Vous vous demandez peut-être que modifier la valeur par défaut de ce paramètre entraînera une validation du moteur de flux de données à valider plusieurs fois. Oui, c’est vrai, mais en même temps, le journal des transactions et tempdb seront soumis à une pression considérable pour se développer considérablement, particulièrement lors des transferts de données à fort volume.

Les deux paramètres ci-dessus sont très importants à comprendre pour améliorer les performances de tempdb et du journal des transactions. Par exemple, si vous laissez la valeur par défaut 'Max insert commit size', le journal des transactions et tempdb continueront de croître pendant le processus d'extraction et si vous transférez un volume élevé de données, tempdb manquera bientôt de mémoire suite à cela votre extraction échouera. Il est donc recommandé de définir ces valeurs sur une valeur optimale en fonction de votre environnement.

Remarque: Les recommandations ci-dessus ont été formulées sur la base de l’expérience acquise en travaillant avec DTS et SSIS au cours des dernières années. Cependant, comme indiqué précédemment, d'autres facteurs ont une incidence sur les performances, notamment l'infrastructure et le réseau. Vous devez donc effectuer des tests approfondis avant de transférer ces modifications dans votre environnement de production.

1
Arvind Yadav