【问题标题】:speed up UPDATE operation加快 UPDATE 操作
【发布时间】:2011-07-29 20:27:50
【问题描述】:

请帮我加快对表的 UPDATE 操作。 表具有唯一 id,用于查找记录并更新其字段。 表中有 1M 条记录。没有使用索引。只有唯一的 id。 插入需要一些时间.. 我预计毫秒。

表结构:

create table customers
(
    id int IDENTITY(1,1) UNIQUE NOT NULL,
    phonenum varchar(15) UNIQUE NOT NULL,
    date datetime,
    company varchar(150),
    full_name varchar(150),
    address varchar(150),   
    street varchar(100),
    zip varchar(100),
    city varchar(100),
    info varchar(300),
    op_data varchar(150),
    op_date datetime,
    op_user_taken varchar(100),
    op_time_taken  datetime,
    op_status varchar(100),
    user_taken varchar(100),
    time_taken  datetime,
    status varchar(100),        
    );

我正在使用 SqlConnection System.Data.SqlClient.SqlConnection 和 ExecuteNonQuery 方法来更新记录。

我的表需要重新设计还是 ExecuteNonQuery 太慢了?

编辑:更新命令:

"UPDATE customers SET user_taken=@param1, time_taken=@param2,
 date=@param3, company=@param4, full_name=@param55,
 address=@param6, street=@param8, zip=@param9,
 city=@param10, info=@param11 , status=\'Completed\',
op_data=@param12 WHERE id=@param7";

【问题讨论】:

  • 我们可以看一个 UPDATE 语句示例吗?
  • 向我们展示您的更新声明。如果您要更新所有 1M 行,那么是的,这需要一些时间。
  • 如果您希望它在几毫秒内发生,那么添加一些索引?如果它必须对包含 100 万条记录的表进行全表扫描,那么不要指望它会很快。 :p
  • 不,当然。首先它需要“免费”记录,锁定它。然后更新它,知道它的 ID。并非所有 1M 记录。每次操作只更新一条记录。
  • 如果表上没有索引,它仍然需要扫描整个表以查找需要更新的记录。添加索引。

标签: c# sql-server database sqlconnection executenonquery


【解决方案1】:

将您的 id 列设为主键。主键自动成为索引。如果您正在运行一个简单的更新语句,例如:

UPDATE customers SET <something> WHERE id = @id 

那么这应该运行一个 INDEX SEEK 并且更快。如果没有该索引,您将使用 TABLE SCAN 进行更新,这比 INDEX SEEK 甚至 INDEX SCAN 花费的时间长几个数量级(如果您要更新大量行,则会发生这种情况)。

另一个技巧是获取更新语句并在 SQL Server 中运行它并查看执行计划。这将告诉您瓶颈在哪里。此外,您可以转到查询选项 |高级 |并设置统计信息显示在输出选项卡中。

【讨论】:

  • 完全同意,这就是索引的用途。
  • PRIMARY KEYUNIQUE 都是约束和索引!
  • 可以,但不能将 UNIQUE 约束设为集群。他还需要在 UNIQUE 约束之上添加一个聚集索引,以便为大量数据实现更好的索引。
  • 不能将其集群化,这不是真的。 CREATE TABLE customers(id INT IDENTITY(1,1) UNIQUE CLUSTERED NOT NULL) 完全有效。发布的 DDL 将能够使用由唯一约束隐式创建的 NCI,然后进行书签查找以查找要更新的行。不是很好,但也不是灾难性的。
【解决方案2】:

我认为这是因为您没有聚集索引(unique 默认为非聚集索引),因此 SQL Server 使用堆上的非聚集索引来定位您的记录以进行更新(UNIQUE 是一个索引)。 Id 应该是主键(默认是集群的),而不是 UNIQUE

【讨论】:

    【解决方案3】:

    试试-

    using (SqlCommand comm = new SqlCommand("update sql", conn))
    {
          SqlDataReader results = (SqlDataReader)comm.ExecuteReader();
    }
    

    只是好奇……

    【讨论】:

    • 为什么使用 ExecuteReader() 来运行 UPDATE 命令?您能解释一下为什么您认为这种方法会更快吗?
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 2010-11-03
    • 2022-10-25
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多