更快地更新Web窗体中的数百万条记录

时间:2013-04-10 02:35:17

标签: c# performance linq

因此,我需要使用TextBox中给出的数据更新后面代码中的asp.net Web表单项目中的超过100万条记录。我尝试用LINQ做到这一点,但这需要很长时间......

第一个问题:什么是最佳解决方案?

我注意到如果我在SQL(MSSQL)中运行更新,它只需要20-30秒,这是一个可接受的时间。

第二个问题:我应该在SQL中创建过程并将其导入我的项目并调用这些过程吗?这会给我一个更好的时间吗?基本上,使用导入的过程会使时间缩短到接近查询在SQL中运行所需的时间吗?

3 个答案:

答案 0 :(得分:0)

如果通过普通查询运行它更快,请创建一个接受参数的存储过程:

using (SqlConnection con = new SqlConnection("connection string here")) {
    using (SqlCommand cmd = new SqlCommand("sp_Stored_Proc_Name_Here", con)) {
      cmd.CommandType = CommandType.StoredProcedure;

      cmd.Parameters.Add("@VariableNameHere", SqlDbType.VarChar).Value = textBoxNameHere.Text;

      con.Open();
      cmd.ExecuteNonQuery();
    }
}

答案 1 :(得分:0)

存储过程应该是最佳解决方案。

但是,您可以使用ADO.NET调用这些存储过程,而无需在项目中导入它们。

存储过程是SQL注入安全的

答案 2 :(得分:0)

使用它可以在您的应用上获得高性能:

1)在调用时创建一个接受TVP(Table-Valued-Parameter)的存储过程。

2)确保您的TVP使用与列数据类型匹配的表值数据类型与目标表的预期索引(因此SQL可以有效地使用索引或任何所需的索引)。

3)在proc中使用正确的事务隔离级别。例如," READ COMMITTED",它提供了良好的响应。

4)在你的存储过程中添加" SET NOCOUNT ON",这样每次执行T-SQL语句时proc都不会发出ADO.Net信号。

5)在SqlConnection对象上(在C#中),将PacketSize属性设置为3000到8000之间的值。使用这些值,直到获得正确的响应时间。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.packetsize.aspx