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 2008 中通过联接在更新表中长时间执行