2013-07-30 2 views
2

Я написал некоторое программное обеспечение для обработки зарплаты, которое в конечном итоге записывает данные в таблицу SQL Server, используя SqlDataAdapter.Insert(). (Я использую команду по умолчанию, созданную с помощью SqlCommandBuilder().) Я использую .NET Framework 4 в Windows 7, записывая SQL Server 2008 (не R2) Std Edition x64 SP3. Проблема в том, что я вижу только пропускную способность 2 Мбит/с с моего ПК (Dell Optiplex 990 Core i7) на SQL Server (сетевые адаптеры на моем ПК и на сервере - GB Enet, но есть несколько переключателей 100 Мбит/с между неудачным узким местом, но все же - 100 Мбит/с). Я могу скопировать файл с моего ПК на сервер, на котором работает SQL Server, и у меня нет проблем с пропускной способностью - я могу получить очень близкую пропускную способность до 100 Мбит/с. Я поместил базу данных на другой LAN SQL Server с 2008 R2, и мне удалось получить пропускную способность 5 Мбит/с, но все же - очень медленно. Процессор моего ПК близок к 0, когда запущена команда Insert(). Я попытался увеличить и уменьшить параметр Packet Size в свойстве SqlConnection.ConnectionString, но это ничего не сделало.SqlDataAdapter Вставьте плохую производительность

Если я выполняю команду SELECT * FROM <table> из SSMS на своем ПК на SQL Server, о которой идет речь, я могу получить пропускную способность около 45 Мбит/с.

Я не уверен, где искать ближайшего виновника - любые одобренные предложения.

+0

Сколько строк было изменено при выполнении обновления? Команда Update обрабатывает только измененные строки. Также почему вы делаете 'Select * from

', а не 'Select * from
где filterColumn = @ filter' Если вы запрашиваете достаточно строк, чтобы максимизировать свою сетевую карту, вы, вероятно, сможете оптимизировать запросы. –

+0

@ScottChamberlain - общая аневризма мозга там - я имел в виду действительно 'Insert()'. Вопрос исправлен. – Conrad

+0

Хорошо, сколько строк вы вставляете сразу? –

ответ

0

Вставка SqlDataAdapter в свои записи по одному, если вы вставляете много записей, вы должны использовать SqlBulkCopy вместо этого, чтобы уменьшить накладные расходы на выполнение этих вставок.

using (SqlConnection destinationConnection = new SqlConnection(connectionString)) 
{ 
    destinationConnection.Open(); 
    using (SqlBulkCopy bulkCopy = 
       new SqlBulkCopy(destinationConnection)) 
    { 
     bulkCopy.DestinationTableName = destTableName; 
     bulkCopy.WriteToServer(sourceDataTable); 
    } 
} 
+0

Большое спасибо - это именно то, что я искал. – Conrad

Смежные вопросы