SQL Server'da geçici bir tabloda 30 bin satır eklemek için en hızlı yolu Ekleme performansımı, SQL Server'da C# kullanarak geçici bir tabloda nasıl geliştirebileceğimi bulmaya çalışıyorum. Bazı insanlar SQLBulkCopy kullanmam gerektiğini söylüyorlar, ancak yanlış bir şey yapmam gerekiyor, çünkü bunun yerine bir SQL insert dizgisi oluşturmaktan çok daha yavaş çalışıyor gibi görünüyor.C#
Kodum SqlBulkCopy altındadır kullanarak tablo oluşturmak için:
public void MakeTable(string tableName, List<string> ids, SqlConnection connection)
{
SqlCommand cmd = new SqlCommand("CREATE TABLE ##" + tableName + " (ID int)", connection);
cmd.ExecuteNonQuery();
DataTable localTempTable = new DataTable(tableName);
DataColumn id = new DataColumn();
id.DataType = System.Type.GetType("System.Int32");
id.ColumnName = "ID";
localTempTable.Columns.Add(id);
foreach (var item in ids)
{
DataRow row = localTempTable.NewRow();
row[0] = item;
localTempTable.Rows.Add(row);
localTempTable.AcceptChanges();
}
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "##" + tableName;
bulkCopy.WriteToServer(localTempTable);
}
}
benim ekler çalışması uzun zaman alabilir bu şekilde.
Ben bir dize olarak ekler bit oluşturulan ve geçici tablo deyimi oluşturmak benim SQL it katıldı: Başka bir şekilde daha hızlı çalışmak benim ekler var ekler dizeOluşturma:
public string prepareInserts(string tableName, List<string> ids)
{
List<string> inserts = new List<string>();
var total = ids.Select(p => p).Count();
var size = 1000;
var insert = 1;
var skip = size * (insert - 1);
var canPage = skip < total;
while (canPage)
{
inserts.Add(" insert into ##" + tableName + @" (ID) values " + String.Join(",", ids.Select(p => string.Format("({0})", p))
.Skip(skip)
.Take(size)
.ToArray()));
insert++;
skip = size * (insert - 1);
canPage = skip < total;
}
string joinedInserts = String.Join("\r\n", inserts.ToArray());
return joinedInserts;
}
yaratma sorgusunun ardından SQL deyiminde bunları kullanma:
insanların benim S kullanmalıdır O (yığın alışverişi https://dba.stackexchange.com/questions/44217/fastest-way-to-insert-30-thousand-rows-in-sql-server/44222?noredirect=1#comment78137_44222 üzerine) bana gördüğüm yanainserts = prepareInserts(tableName, ids);
var query = @"IF EXISTS
(
SELECT *
FROM tempdb.dbo.sysobjects
WHERE ID = OBJECT_ID(N'tempdb..##" + tableName + @"')
)
BEGIN
DELETE FROM ##" + tableName + @"
END
ELSE
BEGIN
CREATE TABLE ##" + tableName + @"
(ID int)
END " + inserts;
var command = new SqlCommand(query, sqlConnection);
...
QLBulkCopy ve bu daha hızlı olurdu Ben bunu yaptığım şekilde geliştirmem gerektiğine inanıyorum. Herkes SQLBulkCopy kodumu nasıl geliştirebileceğimi önerebilirse VEYA uygulamanızın performansını mükemmelleştirebilecek daha iyi bir ekleme ifadesi olup olmadığını söylerse.
Yürütme çalışacak? –
Başka bir uygulamadan gelecek bir anahtar kümesi olacaktır. Bu bağlantıyı henüz yapmadım.Şimdilik test için bazı kimliklerle oluşturduğum bir dizi. – Jenninha
30.000 kimlik büyük olasılıkla bir veritabanından geliyor. Eğer öyleyse, tüm bunları sql ile yapmak için bir yol arıyordum. –