Partager via


Indicateurs d’ordre pour les opérations de copie en bloc

S'applique à : .NET Framework .NET .NET Standard

Télécharger ADO.NET

Les opérations de copie en bloc offrent de gros avantages du point de vue des performances par rapport à d’autres méthodes de chargement des données dans une table SQL Server. Les indicateurs d’ordre permettent d’améliorer encore les performances. Si vous en spécifiez pour vos opérations de copie en bloc, vous pouvez réduire le délai d’insertion des données triées dans les tables avec index cluster.

Par défaut, l’opération d’insertion en bloc considère que les données entrantes ne sont pas ordonnées. SQL Server force un tri intermédiaire de ces données avant de les charger en masse. Si vous savez que vos données entrantes sont déjà triées, vous pouvez utiliser des indicateurs d’ordre pour indiquer à l’opération de copie en bloc l’ordre de tri de toutes les colonnes de destination qui font partie d’un index cluster.

Ajout d’indicateurs d’ordre à une opération de copie en bloc

L’exemple suivant copie en bloc les données d’une table source de l’exemple de base de données AdventureWorks vers une table de destination située dans la même base de données. Un objet SqlBulkCopyColumnOrderHint est créé pour définir l’ordre de tri de la colonne ProductNumber dans la table de destination. L’indicateur d’ordre est ensuite ajouté à l’instance SqlBulkCopy, qui ajoute à la requête INSERT BULK résultante l’argument correspondant à l’indicateur.

using System;
using System.Data;
using Microsoft.Data.SqlClient;

class Program
{
    static void Main()
    {
        string connectionString = GetConnectionString();
        // Open a sourceConnection to the AdventureWorks database.
        using (SqlConnection sourceConnection =
                   new SqlConnection(connectionString))
        {
            sourceConnection.Open();

            // Perform an initial count on the destination table.
            SqlCommand commandRowCount = new SqlCommand(
                "SELECT COUNT(*) FROM " +
                "dbo.BulkCopyDemoMatchingColumns;",
                sourceConnection);
            long countStart = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Starting row count = {0}", countStart);

            // Get data from the source table as a SqlDataReader.
            SqlCommand commandSourceData = new SqlCommand(
                "SELECT ProductID, Name, " +
                "ProductNumber " +
                "FROM Production.Product;", sourceConnection);
            SqlDataReader reader =
                commandSourceData.ExecuteReader();

            // Set up the bulk copy object.
            using (SqlBulkCopy bulkCopy =
                       new SqlBulkCopy(connectionString))
            {
                bulkCopy.DestinationTableName =
                    "dbo.BulkCopyDemoMatchingColumns";

                // Setup an order hint for the ProductNumber column.
                SqlBulkCopyColumnOrderHint hintNumber =
                    new SqlBulkCopyColumnOrderHint("ProductNumber", SortOrder.Ascending);
                bulkCopy.ColumnOrderHints.Add(hintNumber);

                // Write from the source to the destination.
                try
                {
                    bulkCopy.WriteToServer(reader);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // Close the SqlDataReader. The SqlBulkCopy
                    // object is automatically closed at the end
                    // of the using block.
                    reader.Close();
                }
            }

            // Perform a final count on the destination 
            // table to see how many rows were added.
            long countEnd = System.Convert.ToInt32(
                commandRowCount.ExecuteScalar());
            Console.WriteLine("Ending row count = {0}", countEnd);
            Console.WriteLine("{0} rows were added.", countEnd - countStart);
            Console.WriteLine("Press Enter to finish.");
            Console.ReadLine();
        }
    }

    private static string GetConnectionString()
    // To avoid storing the sourceConnection string in your code, 
    // you can retrieve it from a configuration file. 
    {
        return "Data Source=(local); " +
            " Integrated Security=true;" +
            "Initial Catalog=AdventureWorks;";
    }
}

Étapes suivantes