C# 在SQL Server上使用C在临时表中插入30000行的最快方法#
我试图找出如何使用c#提高SQL Server中临时表的插入性能。有些人说我应该使用SQLBulkCopy,但我一定是做错了什么,因为它似乎比简单地构建SQL插入字符串慢得多 我使用SQLBulkCopy创建表的代码如下:C# 在SQL Server上使用C在临时表中插入30000行的最快方法#,c#,sql,sql-server,bulkinsert,sqlbulkcopy,C#,Sql,Sql Server,Bulkinsert,Sqlbulkcopy,我试图找出如何使用c#提高SQL Server中临时表的插入性能。有些人说我应该使用SQLBulkCopy,但我一定是做错了什么,因为它似乎比简单地构建SQL插入字符串慢得多 我使用SQLBulkCopy创建表的代码如下: public void MakeTable(string tableName, List<string> ids, SqlConnection connection) { SqlCommand cmd = new SqlCommand("
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);
}
}
因为我看到有人(在堆栈交换上)告诉我应该使用SQLBulkCopy,这样会更快,我相信我应该改进我的方法。因此,如果有人能建议我如何改进SQLBulkCopy代码,或者告诉我是否有更好的insert语句可以提高我的应用程序的性能,那就太好了。您的问题可能出在
localtentable.AcceptChanges()代码>因为它提交了您的更改。
如果你做下一步,我想它会跑得更快
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);
}
从
提交自加载或删除此数据集以来对此数据集所做的所有更改
自从上次调用AcceptChanges以来
我自己用秒表对象运行这段代码来测量时间。每一次迭代中的变化都会使速度变慢
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);
System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();
sw1.Start();
foreach (var item in ids)
{
DataRow row = localTempTable.NewRow();
row[0] = item;
localTempTable.Rows.Add(row);
}
localTempTable.AcceptChanges();
long temp1 = sw1.ElapsedMilliseconds;
sw1.Reset();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "##" + tableName;
bulkCopy.WriteToServer(localTempTable);
}
long temp2 = sw1.ElapsedMilliseconds;
}
public void MakeTable(字符串tableName、列表id、SqlConnection)
{
SqlCommand cmd=newsqlcommand(“创建表##”+tableName+“(ID int)”,连接);
cmd.ExecuteNonQuery();
DataTable localtentable=新的DataTable(tableName);
DataColumn id=新的DataColumn();
id.DataType=System.Type.GetType(“System.Int32”);
id.ColumnName=“id”;
localtentable.Columns.Add(id);
System.Diagnostics.Stopwatch sw1=新的System.Diagnostics.Stopwatch();
sw1.Start();
foreach(ID中的变量项)
{
DataRow row=localtentable.NewRow();
行[0]=项目;
localtentable.Rows.Add(row);
}
localetreable.AcceptChanges();
长temp1=sw1.elapsedmillyses;
sw1.Reset();
使用(SqlBulkCopy-bulkCopy=newsqlbulkcopy(连接))
{
bulkCopy.DestinationTableName=“##”+表名;
bulkCopy.WriteToServer(LocalTestable);
}
长temp2=sw1.elapsedmillyses;
}
AccpetChanges位于foreach循环内时的结果
而当它不是
差别有三个数量级:)使用它,它会运行得更快
而不是cmd.ExecuteNonQuery()代码>
执行
这个字符串列表的数据首先来自哪里?它将是来自另一个应用程序的一组键。我还没有完成这个链接。现在它是我用一些id创建的一个数组,用于测试。30000个id可能来自某个数据库。如果是这样的话,我将寻找一种用sql完成所有这些的方法。它可能不会来自sql,这就是为什么需要为我的案例创建一个临时表的原因。它确实运行得更快。谢谢使用IDataReader比使用DataTable好,这是对的,但是使用cmd.executeReader()
是错误的,它仍然应该是cmd.ExecuteNonQuery()因为代码实际上不返回任何结果集。
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);
}
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);
System.Diagnostics.Stopwatch sw1 = new System.Diagnostics.Stopwatch();
sw1.Start();
foreach (var item in ids)
{
DataRow row = localTempTable.NewRow();
row[0] = item;
localTempTable.Rows.Add(row);
}
localTempTable.AcceptChanges();
long temp1 = sw1.ElapsedMilliseconds;
sw1.Reset();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection))
{
bulkCopy.DestinationTableName = "##" + tableName;
bulkCopy.WriteToServer(localTempTable);
}
long temp2 = sw1.ElapsedMilliseconds;
}
cmd.ExecuteReader()