【问题标题】:sql server executing update it takes more timesql server 执行更新需要更多时间
【发布时间】:2016-08-27 05:05:37
【问题描述】:

我有两个表(UserTable 和 UserProfile)和结构:

创建表用户表( id_user int identity(1,1) 主键, 名称 varchar(300) 不为 null , 电子邮件 varchar(500) 不为空, PasswordUser varchar(700) 不为空, 用户类型 int , 约束 usertype_fk 外键(userType) REFERENCES userType(id_type) 删除时设置为空 )

和 userPtrofile:

创建表用户配置文件( id_profile int identity(1,1) 主键, ClientCmpName varchar(300) 空, 客户地址 varchar(500) null, 电话 varchar(50) 空值, descriptionClient varchar(400) null, img 图像为空, 消息客户端文本, fk_user int , 约束 fkuser 外键(fk_user) 引用 userTable(id_user) 在删除级联 )

我使用的是 SQL Server 2008。 问题是当我更新记录时执行负载而不执行 这是示例查询:

更新 UserProfile 设置 messageClient=N'010383772' where fk_user=2;

截图

【问题讨论】:

  • 我怀疑部分性能损失是它正在更新一个text 字段,该字段未与其余行数据内联存储,并且是每条记录的额外跃点要更新。但是,关于此的文档 (technet.microsoft.com/en-us/library/…) 说,只要数据很小,就不必做额外的跳跃。我不知道这个优化是否是在 2008 年完成的。

标签: sql sql-server sql-server-2008


【解决方案1】:

如果您关心此查询的性能:

update UserProfile
    set messageClient = N'010383772'
    where fk_user = 2;

那么索引会很有帮助:

create index idx_UserProfile_fkuser on UserProfile(fk_user);

这应该使查询几乎是即时的。

注意:索引会减慢插入和其他操作的速度。这通常不是什么大问题,而且在外键列上有索引很常见。

【讨论】:

  • 非常感谢您快速回答,但我的问题没有解决
  • 外键已经是非聚集索引,因此向其添加另一个索引不会带来性能提升 - 正如 OP 所说。
  • 我不确定您从哪里获得此信息,但对于 SQL Server 而言并非如此(但对于 MySQL 而言确实如此):“与主键约束不同,当定义了外键约束时对于表,SQL Server 默认不创建索引。" (sqlperformance.com/2012/11/t-sql-queries/…)
【解决方案2】:

愚蠢的问题,您为什么要尝试根据 [userType] 值进行更新?

update UserProfile set messageClient=N'010383772' where fk_user=2;

您不想根据其 ID 更新一个特定 [UserProfile] 上的此值(这是一个主键,因此会快得多)

UPDATE [UserProfile] 
SET [messageClient]='010383772' 
WHERE id_profile=2;

也许性能问题是由于您的 UPDATE 尝试使用此特定 UserType 值更新您的所有 [UserProfile] 记录...?

或者我错过了您正在尝试做的事情(以及您尝试更新多少记录)。

【讨论】:

  • 我只录了一张
  • 好的,你运行我的 UPDATE 的性能如何,具有特定的 [UserProfile] ID 值?
【解决方案3】:

也许您已经在另一个进程(可能是另一个查询编辑器页面)的表上启动了一个事务(BEGIN TRANSACTION),并且在您不停止该事务之前,该表将不可用于更新。 检查变量选择@@trancount,或尝试回滚您已经进行的更新(ROLLBACK TRANSACTION)。 还要检查其他表是否可以毫无问题地更新。

【讨论】:

  • 我检查其他表没问题,更新成功
  • 如果我以某种方式帮助了您,请在箭头下方检查答案是否已接受,谢谢。
【解决方案4】:

查询是否曾经执行过?这似乎是一个僵局。你应该 open the activity monoitorcheck if your query is blocked 通过某些进程。

在这种情况下,您应该终止阻塞查询。

【讨论】:

    【解决方案5】:

    感谢您尝试帮助我 我的问题解决了问题是另一个查询编辑器页面,因为我使用 asp.net 和另一个页面,当我停止 asp.net 项目时,我使用相同的记录更新相同的记录,然后查询成功

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多