sql server 执行更新需要更多时间

Posted

技术标签:

【中文标题】sql server 执行更新需要更多时间【英文标题】:sql server executing update it takes more time 【发布时间】: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 年完成的。 【参考方案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 monoitor 和 check if your query is blocked 通过某些进程。

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于sql server 执行更新需要更多时间的主要内容,如果未能解决你的问题,请参考以下文章

更新 SQL Server 表以通过存储过程执行此操作

在 SQL Server 2008 中通过联接在更新表中长时间执行

在 Sql Server 中插入或更新多行

SQL Server 2005 中的内置数据库角色允许执行存储过程?

02 | 日志系统:一条SQL更新语句是如何执行的?

在 SQL Server 中创建审核触发器