Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op: .NET Framework
.NET
Standard
Bulkkopiebewerkingen bieden aanzienlijke prestatievoordelen ten opzichte van andere methoden voor het laden van gegevens in een SQL Server-tabel. De prestaties kunnen verder worden verbeterd met behulp van orderhints. Het opgeven van orderhints voor uw bulkkopiebewerkingen kan de invoegtijd van gesorteerde gegevens in tabellen met geclusterde indexen verlagen.
Standaard wordt bij de bulksgewijze invoegbewerking ervan uitgegaan dat de binnenkomende gegevens niet zijn gerangschikt. SQL Server dwingt een tussenliggend type van deze gegevens af voordat deze bulksgewijs wordt geladen. Als u weet dat uw binnenkomende gegevens al zijn gesorteerd, kunt u orderhints gebruiken om de bulkkopiebewerking te vertellen over de sorteervolgorde van doelkolommen die deel uitmaken van een geclusterde index.
Orderhints toevoegen aan een bulk kopieeroperatie
In het volgende voorbeeld worden gegevens uit een brontabel in de voorbeelddatabase AdventureWorks bulksgewijs gekopieerd naar een doeltabel in dezelfde database.
Er wordt een SqlBulkCopyColumnOrderHint-object gemaakt om de sorteervolgorde voor de kolom ProductNumber in de doeltabel te definiëren. De orderhint wordt vervolgens toegevoegd aan het SqlBulkCopy-exemplaar, waarmee het juiste argument voor de orderhint wordt toegevoegd aan de resulterende INSERT BULK query.
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;";
}
}