更快地更新Web表单中的数百万条记录

本文关键字:数百万 记录 表单 更新 Web | 更新日期: 2023-09-27 18:08:16

所以我需要更新一些超过100万条记录从asp.net web表单项目背后的代码与TextBox给出的数据。我试图用LINQ做到这一点,但这需要很长时间…

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

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

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

更快地更新Web表单中的数百万条记录

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

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();
    }
}

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

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

存储过程是sql注入安全的

使用它来获得应用程序的高性能:

1)创建一个存储过程,在调用它时接受一个TVP (table - value - parameter)。

    这样,您只调用一次进程并一次刷新所有数据你必须使用ADO。. Net调用它(LINQ不支持tvp)
  • 资源如下:
    • 定义过程 http://technet.microsoft.com/en-us/library/bb510489.aspx
    • c#调用 http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx

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

3)在你的进程中使用一个正确的事务隔离级别,例如,"READ COMMITTED",它会给出很好的响应。

4)将"SET NOCOUNT ON"添加到您的存储进程中,因此该进程不会发出ADO信号。. Net .

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