Tôi đang cố gắng tìm hiểu cách tôi có thể cải thiện hiệu suất chèn của mình trong bảng tạm thời trong SQL Server bằng cách sử dụng C#. Một số người nói rằng tôi nên sử dụng SQLBulkCopy tuy nhiên tôi phải làm một cái gì đó sai vì nó có vẻ làm việc chậm hơn nhiều so với việc xây dựng một chuỗi chèn SQL thay thế.Cách nhanh nhất để chèn 30 nghìn hàng trong bảng tạm thời trên Máy chủ SQL với C#
Mã của tôi để tạo ra bảng sử dụng SqlBulkCopy là dưới đây:
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);
}
}
Bằng cách này chèn của tôi mất nhiều thời gian để chạy. Tôi đã chèn của tôi để làm việc nhanh hơn theo cách khác:
Tôi tạo ra các bit chèn như là một chuỗi và gia nhập nó trong SQL của tôi tạo ra tạm thời bảng tuyên bố:
Tạo chèn chuỗi:
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;
}
sử dụng chúng trong các câu lệnh SQL sau khi tạo truy vấn:
inserts = 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);
...
kể từ khi tôi đã nhìn thấy người nói với tôi (trên stack trao đổi https://dba.stackexchange.com/questions/44217/fastest-way-to-insert-30-thousand-rows-in-sql-server/44222?noredirect=1#comment78137_44222) Rằng tôi nên sử dụng S QLBulkCopy và điều đó sẽ nhanh hơn tôi tin rằng tôi nên cải thiện cách tôi làm điều đó. Vì vậy, nếu bất cứ ai có thể đề nghị làm thế nào tôi có thể cải thiện mã SQLBulkCopy của tôi HOẶC cho tôi biết nếu có một tuyên bố chèn tốt hơn có thể cải thiện hiệu suất của ứng dụng của tôi mà sẽ là tuyệt vời.
đâu dữ liệu cho danh sách này của chuỗi đến từ ở nơi đầu tiên? –
Nó sẽ là một tập hợp các khóa sẽ đến từ một ứng dụng khác. Tôi chưa thực hiện liên kết này.Bây giờ nó là một mảng mà tôi tạo ra với một số id để kiểm tra. – Jenninha
30.000 id có thể đến từ một cơ sở dữ liệu ở đâu đó. Nếu vậy, tôi sẽ tìm kiếm một cách để làm tất cả điều này với sql. –