Sql server 2008 - функции настройки производительности для вставки большого объема данных - PullRequest
3 голосов
/ 20 октября 2010

Мне нужно вставить большое количество данных в таблицу. Есть ли в sqlserver 2008 (по сравнению с 2005) какие-либо новые функции для повышения производительности в этом случае?

Ответы [ 2 ]

4 голосов
/ 20 октября 2010

SQL Server 2008 содержит оператор TSQL MERGE , который может ускорить определенные типы комбинированных операций INSERT, UPDATE и DELETE.

Если вы собираетесь выполнять через код, я бы предложил использовать класс System.Data.SqlClient.SqlBulkCopy (но также присутствует в SQL Server 2005).

1 голос
/ 20 октября 2010

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

В прошлом у меня был похожий вопрос для большого проекта:необходимо было импортировать производственные данные за 15 лет в новую схему (в SQL Server 2005.) System.Data.SqlClient.SqlBulkCopy был безусловно самым быстрым вариантом.

Если вы все же пойдете этим путем, я предлагаю сделатьвставляет по 1 ГБ за раз, затем вручную вызывает .NET GC, чтобы освободить таблицу в памяти.Я был вынужден сделать обе эти вещи, чтобы не столкнуться с ошибками памяти (32-битная система, хотя.)

Edit - псевдокод для моего решенияg был что-то вроде:

Table dataToInsert = new Table();
var sqlCommand = new SqlCommand("select * from old database");
DataReader dataFromOldSystem = sqlCommand.ExecuteReader();
foreach (DataRow oldRow in dataFromOldSystem.Tables[0])
{
// I had to modify/transpose the row from the old table in some way
DataRow newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(2));
dataToInsert.AddRow(newRow);

newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(3));
dataToInsert.AddRow(newRow);

newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(4));
dataToInsert.AddRow(newRow);

// check if the number of rows is over some magic number that is below the memory limit
// you can check the private bytes in use by your app to help guess this number
if (dataToInsert.Rows.Count > 1000000)
{
SqlBulkCopy bulkCopier = new BulkCopy(blah);
bulkCopier.Execute();

dataToInsert = null;
GC.Finalize();
GC.Free;

dataToInsert = new Table();
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...