Hinweise zur Reihenfolge bei Massenkopiervorgängen

Gilt für: .NET Framework .NET .NET Standard

Herunterladen von ADO.NET

Massenkopiervorgänge bieten im Vergleich zu anderen Methoden für das Laden von Daten in eine SQL Server-Tabelle erhebliche Leistungsvorteile. Durch Hinweise zur Reihenfolge bei Massenkopiervorgängen kann die Leistung weiter gesteigert werden. Das Angeben von Hinweisen zur Reihenfolge bei Massenkopiervorgängen kann die Einfügezeit für sortiere Daten in Tabellen mit gruppierten Indizes verringern.

Standardmäßig geht der Masseneinfügevorgang davon aus, dass die eingehenden Daten nicht sortiert sind. SQL Server erzwingt eine vorläufige Sortierung dieser Daten, bevor ein Massenladen durchgeführt wird. Wenn Sie wissen, dass die eingehenden Daten bereits sortiert sind, können Sie Hinweise zur Reihenfolge verwenden, um dem Massenkopiervorgang die Sortierreihenfolge beliebiger Zielspalten mitzuteilen, die Teil eines gruppierten Indexes sind.

Hinzufügen von Hinweisen zur Reihenfolge bei Massenkopiervorgängen

Im folgenden Beispiel werden Daten aus einer Quelltabelle in der Beispieldatenbank AdventureWorks in eine Zieltabelle derselben Datenbank massenkopiert. Ein SQlBulkCopyColumnOrderHint-Objekt wird erstellt, um die Sortierreihenfolge für die Spalte ProductNumber in der Zieltabelle zu definieren. Der Hinweis zur Sortierreihenfolge wird dann der SqlBulkCopy-Instanz hinzugefügt, die dann wiederum das Argument für den entsprechenden Hinweis zur Sortierreihenfolge an die resultierende INSERT BULK-Abfrage anfügt.

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

Nächste Schritte