Share via


Sugerencias de orden para operaciones de copia masiva

Se aplica a: .NET Framework .NET .NET Standard

Descargar ADO.NET

Las operaciones de copia masiva ofrecen importantes ventajas de rendimiento con respecto a otros métodos a la hora de cargar datos en una tabla de SQL Server. El rendimiento se puede mejorar aún más mediante el uso de sugerencias de orden. Al especificar sugerencias de orden para las operaciones de copia masiva se puede reducir el tiempo de inserción de los datos ordenados en tablas con índices agrupados.

De forma predeterminada, la operación de inserción masiva presupone que los datos entrantes no están ordenados. SQL Server fuerza una ordenación intermedia de estos datos antes de cargarlos de forma masiva. Si sabe que los datos entrantes ya están ordenados, puede utilizar las sugerencias de orden para indicar a la operación de copia masiva el criterio de ordenación de las columnas de destino que forman parte de un índice agrupado.

Agregar sugerencias de orden a una operación de copia masiva

En el ejemplo siguiente se copian de forma masiva datos de una tabla de origen en la base de datos de ejemplo AdventureWorks a una tabla de destino en la misma base de datos. Se crea un objeto SqlBulkCopyColumnOrderHint para definir el criterio de ordenación de la columna ProductNumber en la tabla de destino. Después, se agrega la sugerencia de orden a la instancia de SqlBulkCopy, que anexará el argumento de sugerencia de orden adecuado a la consulta de INSERT BULK resultante.

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;";
    }
}

Pasos siguientes