Я використовую цей код, щоб вставити 1 мільйон записів у порожню
таблицю бази даних. Так, без особливого коду я почну з того
моменту, коли я вже взаємодіяла з даними, і читаю схему в
DataTable
Тому:
DataTable returnedDtViaLocalDbV11 = DtSqlLocalDb.GetDtViaConName(strConnName, queryStr, strReturnedDtName);
І тепер, коли ми маємо returnDtViaLocalDbV11
,
можна створити новий DataTable
, щоб стати клоном
таблиці вихідної бази даних:
DataTable NewDtForBlkInsert = returnedDtViaLocalDbV11.Clone();
Stopwatch SwSqlMdfLocalDb11 = Stopwatch.StartNew();
NewDtForBlkInsert.BeginLoadData();
for (int i = 0; i < 1000000; i++)
{
NewDtForBlkInsert.LoadDataRow(new object[] { null, "NewShipperCompanyName"+i.ToString(), "NewShipperPhone" }, false);
}
NewDtForBlkInsert.EndLoadData();
DBRCL_SET.UpdateDBWithNewDtUsingSQLBulkCopy(NewDtForBlkInsert, tblClients._TblName, strConnName);
SwSqlMdfLocalDb11.Stop();
var ResSqlMdfLocalDbv11_0 = SwSqlMdfLocalDb11.ElapsedMilliseconds;
Цей код заповнює 1 мільйон записів до вбудованої бази даних SQL
(localDb) у 5200ms . Решта коду - це просто
реалізація bulkCopy, але я все одно напишу його.
public string UpdateDBWithNewDtUsingSQLBulkCopy(DataTable TheLocalDtToPush, string TheOnlineSQLTableName, string WebConfigConName)
{
//Open a connection to the database.
using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings[WebConfigConName].ConnectionString))
{
connection.Open();
//Perform an initial count on the destination table.
SqlCommand commandRowCount = new SqlCommand("SELECT COUNT(*) FROM "+TheOnlineSQLTableName +";", connection);
long countStart = System.Convert.ToInt32(commandRowCount.ExecuteScalar());
var nl = "\r\n";
string retStrReport = "";
retStrReport = string.Concat(string.Format("Starting row count = {0}", countStart), nl);
retStrReport += string.Concat("==================================================", nl);
//Create a table with some rows.
//DataTable newCustomers = TheLocalDtToPush;
//Create the SqlBulkCopy object.
//Note that the column positions in the source DataTable
//match the column positions in the destination table so
//there is no need to map columns.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = TheOnlineSQLTableName;
try
{
//Write from the source to the destination.
for (int colIndex = 0; colIndex < TheLocalDtToPush.Columns.Count; colIndex++)
{
bulkCopy.ColumnMappings.Add(colIndex, colIndex);
}
bulkCopy.WriteToServer(TheLocalDtToPush);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
//Perform a final count on the destination
//table to see how many rows were added.
long countEnd = System.Convert.ToInt32(
commandRowCount.ExecuteScalar());
retStrReport += string.Concat("Ending row count = ", countEnd, nl);
retStrReport += string.Concat("==================================================", nl);
retStrReport += string.Concat((countEnd - countStart)," rows were added.", nl);
retStrReport += string.Concat("New Customers Was updated successfully", nl, "END OF PROCESS !");
//Console.ReadLine();
return retStrReport;
}
}
Trying it via a connection to SQL server was around 7000ms(at
best) & ~7700ms average. Also via a random kv nosql database took
around 40 sec (really I did not even keep records of it as it
passed over the x2 of sql variants). So... is there a faster way
than what I was testing in my code?
Edit
Я використовую win7 x64 8gb ram і найважливішим я повинен думати
(як i5 3ghz) не так вже й великий x3 500Gb Wd на Raid-0 робить
роботу ще кращою але я просто кажу, якщо ви будете перевіряти на
вашому комп'ютері хоч і порівняйте його з будь-яким іншим методом у
вашій конфігурації