Augmenter la vitesse de copie en bloc SQL sur Azure

azure c# sqlbulkcopy sql-server

Question

Je travaille sur un projet dans lequel je dois transférer une application sur site vers Azure. Nous avons un utilitaire de téléchargement qui transfère environ 150 000 enregistrements vers l'application Web (MVC App). Malheureusement, je rencontrais des problèmes de dépassement de délai après avoir migré vers Azure. J'ai apporté plusieurs modifications, notamment l'utilisation de SqlBulkCopy et des procédures de SqlBulkCopy au lieu d'utiliser SqlCommand . Le problème du délai d'attente a maintenant été résolu, mais le téléchargement des données prend environ 5 minutes pour télécharger les 150 000 enregistrements dans une table sur Azure.

J'utilise une version d'évaluation sur Azure et mon unité de base de données de base de données est de 20. À présent, j'aimerais le conserver à 20 en raison du coût. J'ai un petit budget avec lequel je travaille. Remarque, la taille de la base de données n'est pas un problème. Je suis bien en dessous du quota.

Des suggestions sur la façon dont je peux réduire le temps nécessaire pour insérer ces 150 000 enregistrements?

Exemple de code

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection))
                    {
                        bulkCopy.BulkCopyTimeout = 0;
                        bulkCopy.BatchSize = 10000;
                        bulkCopy.ColumnMappings.Add("Barcode", "Barcode");
                        bulkCopy.ColumnMappings.Add("SubCategory", "SubCategory");
                        bulkCopy.ColumnMappings.Add("ItemDescription", "ItemDescription");
                        bulkCopy.ColumnMappings.Add("CreateDate", "CreateDate");
                        bulkCopy.ColumnMappings.Add("RevisedDate", "RevisedDate");

                        bulkCopy.DestinationTableName = "Items";
                        try
                        {
                            bulkCopy.WriteToServer(dtTblData);
                            destinationConnection.Close();
                        }
                        catch (Exception ex)
                        {
                            this.Logs.Add(DateTime.Now.ToString() + ": " + ex.Message);
                        }
                    }
                }

FYI: Pendant l’opération d’insertion, la DTU pour ma base de données atteint 100%.

Réponse d'expert

L'utilisation de l'option SqlBulkCopyOptions.TableLock augmentera les performances.

Donc, si vous pouvez verrouiller la table, vous devriez sans aucun doute l'utiliser.

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection, SqlBulkCopyOptions.TableLock))
{
    // ...code...
}

En dehors de cette configuration, vous ne pouvez pas faire beaucoup de choses puisque vous utilisez déjà SqlBulkCopy. Le goulot d'étranglement correspond aux performances de votre base de données que vous ne pouvez pas améliorer en raison du budget.


Réponse populaire

Outre le verrouillage de la table mentionné par Jonathan, le seul moyen d'augmenter les performances consiste à augmenter le nombre de DTU pour le service.

Toutefois, vous n'avez pas besoin de laisser la base de données sur le paramètre le plus élevé pour toujours. Si ce chargement en bloc est une opération peu fréquente, vous pouvez élever temporairement les unités de bureau de la base de données, faire votre charge, puis abaisser les unités de bureau. Vous ne seriez facturé au tarif plus élevé que pour le moment où vous avez réellement téléchargé.

Vous pouvez modifier la base de données via du code à l'aide du kit de développement Microsoft.Azure.Management.Sql.DatabasesOperationsExtensions SDK) Azure et des fonctions de la classe Microsoft.Azure.Management.Sql.DatabasesOperationsExtensions et en définissant la valeur RequestedServiceObjectiveId avec un objectif de niveau supérieur (les 20 DTU que vous utilisez actuellement sont un objectif S1, vous pouvez vous déplacer jusqu’à un S2 (50 DTU pendant le chargement en bloc) sur l’objet Database vous transmettez à la fonction de mise à jour.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi