update值与原值相同时,SQL Server会真的去update还是忽略呢?

SQL Server UPDATE JOIN实战指南:原理、避坑与性能优化 UPDATE JOIN是关系型数据库中实现跨表数据同步的核心技术,其本质并非简单语法糖,而是基于JOIN条件构建临时更新上下文的原子化行级操作。理解INNER JOIN的靶向更新机制与LEFT JOIN中COALESCE()对NULL值的显式控制,是保障数据一致性的关键原理。该技术在金融、电商等强一致性场景中具备不可替代的技术价值,广泛应用于客户信息同步、订单状态修正、主数据治理等典型业务流程。本文聚焦SQL Server平台,深入解析执行计划、索引策略、批处理与锁控制等工程实践要点,为DBA和后端工程师提 阅读详情

考虑下面的情况:

当update值与原值相同时,SQL Server会真的去update还是忽略?例如:

update tbname
set name='abc' --name原来的值就是abc
where id=1

再如:

update tbname
set name='abc' --name原来的值就是abc
where name='abc'


接下来我们将实际测试:

--Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)   Jun 17 2011 00:54:03   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) 

 
1.首先我们先把checkpoint关闭掉,这里用到一个TraceFlog 3505,具体信息参见这里;

DBCC TRACEON (3505);

2.准备测试数据:

复制代码
CREATE DATABASE DB_test 
GO
USE DB_test
GO
CREATE TABLE t (
   a INT,
   b CHAR(1),
   CONSTRAINT PK_t PRIMARY KEY CLUSTERED (a)
);
 
INSERT INTO t VALUES (1,'A');
INSERT INTO t VALUES (2,'B');
INSERT INTO t VALUES (3,'C');
INSERT INTO t VALUES (4,'D');
INSERT INTO t VALUES (5,'E');
 
CHECKPOINT;
复制代码

3.查看事务日志

SELECT [Current LSN], Operation, Context, [Transaction ID], AllocUnitName
FROM fn_dblog(null, null);

得到如下结果:

此处显示的是之前步骤2的checkpoint的记录,此时只有两条记录

4.此时查看刚创建的表的page情况

DBCC IND ('DB_test','t',1);

结果:

我们可以看到上面的page78是刚才所插入的5条数据所在的page. (PageType=1是DataPage, PageType=10是IAM Page)

5.执行一个update本身的SQL语句,然后再看事务日志,以及内存中的脏数据

复制代码
UPDATE t
SET b = 'C'
WHERE a =3;
 
-- 查看日志
SELECT [Current LSN], Operation, Context, [Transaction ID], AllocUnitName
FROM fn_dblog(null, null);
 
-- 查看脏数据
select * from sys.dm_os_buffer_descriptors
where database_id = db_id() AND is_modified = 1
order by page_id;
复制代码

结果如下:

从上面的结果,我们看到有事务日志的记录,但并不是我们的表t,而是sys.sysobjvalues.clst,它是什么呢?从联机文档查到:

sys.sysobjvalues   存在于每个数据库中。实体的每个常规值属性均存在对应的一行。

从事务日志看,SQL Server并没有真的去update这条记录,然后我们看一下脏数据中是否有对这个page的修改:

从上面看到内存中的被修改的Pageid是152,并不是表t的Page78.

由此我们可以认为SQL Server并不会真的去作一个与原值相同的update操作。

6.如果我们此再更新几个与原值相同的操作,如:

复制代码
UPDATE t
SET b = 'D'
WHERE a =4;
 
-- 查看日志
SELECT [Current LSN], Operation, Context, [Transaction ID], AllocUnitName
FROM fn_dblog(null, null);
 
-- 查看脏数据
select * from sys.dm_os_buffer_descriptors
where database_id = db_id() AND is_modified = 1
order by page_id;
复制代码

结果如下:

可以看到事务日志没有增加新的记录,脏数据没有变化,依然是刚才的数据。

7.如果我们此时手动checkpoint,然后再做一个update原值操作呢?

复制代码
Checkpoint
GO
UPDATE t
SET b = 'E'
WHERE a =5;
 
-- 查看日志
SELECT [Current LSN], Operation, Context, [Transaction ID], AllocUnitName
FROM fn_dblog(null, null);
 
-- 查看脏数据
select * from sys.dm_os_buffer_descriptors
where database_id = db_id() AND is_modified = 1
order by page_id;
复制代码

结果如下:

8.如果我们更新一个不同的值,会是什么情况?

复制代码
UPDATE t
SET b = 'Z'
WHERE a =1;
 
-- 查看日志
SELECT [Current LSN], Operation, Context, [Transaction ID], AllocUnitName
FROM fn_dblog(null, null);
 
-- 查看脏数据
select * from sys.dm_os_buffer_descriptors
where database_id = db_id() AND is_modified = 1
order by page_id;
复制代码

结果如下:

我们可以很清楚的看到它的update的Log以及脏数据page.

9.所以,由上面的多个测试结果可以看出,如果update的值与原值相同,SQL Server并不会真的去做一个这样的操作,而是忽略掉了。

10.通过工具ApexSQL也可以证明这个结论,它只记录了insert和最后一次update;

11.最后,记得DBCC TRACEOFF (3505);

SQL Server UPDATE JOIN 实战指南:原子更新与生产安全 UPDATE JOIN 是关系型数据库中实现跨表数据原子更新的核心技术,其本质是利用数据库引擎内联匹配能力,在单次执行中完成条件过滤、关联计算与目标写入,避免应用层多次往返带来的竞态、延迟与一致性风险。相比标准子查询或 MERGE,它在 OLTP 场景下具备更优的执行计划可控性、更低的内存开销和更强的事务边界保障。该技术广泛应用于主从表同步、订单状态修正、维度补全等强一致性业务场景,尤其适合 SQL Server 环境下处理 Customers-Orders-Addresses 等典型多表关联结构。掌握 U 阅读详情

相关推荐

SQL Server使用中最容易忽略的21个问题

在使用SQL Server进行数据库开发和管理时,有一些常见的问题往往容易被忽略,但它们可能会对系统的性能、安全性和可维护性产生负面影响。本文将介绍SQL Server使用中最容易忽略的21个问题,并提供相应的源代码示例。

DiAngular的博客 83

【Sql Server】Update中的From语句,以及常见更新操作方式

最近在做数据修改,有时候太久没写sql语句,突然想通过子查询的方式去批量更新数据的时候, 还是有点不知所措,那就一步一步来吧,也写篇文章梳理和总结下,毕竟也是基本的操作加深印象。 上篇文章已经介绍分组查询方法,这篇文章将通过分析update更新有那些语句和方式方法。

小5聊的博客 1万+

sql server的 update from 语句的深究

一般来说update一个表, 使用where语句即可: 代码如下: UPDATE Ttest SET     statusInd = ‘ACTIVE’  WHERE     id = 123 注意: update 语句后面的table名称,是不可以启用别名的。 那么此时的id字段,就是来自Ttest表的(无可厚非) 但是,如果update,还有额外的join table 条件约束,语句如下: 代码如下: UPDATE Ttest SET     statusInd = ‘ACTIVE’ FROM     Tparent parent WHERE     Ttest.id = 123 AN

Update中的From语句

Oracle\MS SQL Server的数据库多表关联更新UPDATE与多表更新【原】 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表    一、MS    SQL    Server   多表关联更新      sql server提供了upda...

骆驼草的家园 1904

CELF(Cost-Effective Lazy Forward selection)具有成本效益的惰性前向选择算法

CELF(Cost-Effective Lazy Forward selection)算法解析      引言:在社交网络影响力最大化问题的求解过程中,我们往往需要去选择一些目标种子结点作为信息初始传播的源头。贪婪算法在传播效果上的解决可以达到影响的最大化,但是在时间复杂度上面显得确十分糟糕。为此CELF算法应势而生,CELF算法利用了函数次模性的特点,在第一轮选择种子结点时,计算网络中所有节点的边际收益,但将在之后的过程中,不再做网络节点边际收益的重复计算,这相对于传统的贪婪算法,将在时间上得到非常明显的

hahaxq的博客 2476

云桌面如何部署?云桌面系统方案部署详细教程

云桌面作为一种比较新的技术工具,核心解决的场景是方便设计师的灵活办公,本身技术就是非常的灵活性,所以在安装部署方面青椒云也做到了十足的灵活。

2301_79113726的博客 1633

SQL:在原内容的基础上进行加数据/替换原数据

定义: 1.A代表数据表名(例如表user) 2.B代表数据表里面的某个需要更新的字段(例如表user里面的ID字段ID) 3.C为原内容(例如user表里里面的ID=1) 在原基础上加: SQL: update `A` set B=CONCAT(A.B, FLOOR( 500 + RAND() * (1000 - 500)))WHERE `B` = C 即根据以上内容根据举例则应该为: update `user` set ID=CONCAT(user.ID, FLOOR( 500 +

qq_38653748的博客 5313

Mac 不小心断开移动硬盘导致磁盘无法读取和加载(顺利解决!)

Mac移动硬盘不正确断开连接导致无法读取加载的解决方法,亲测有效

Robin_Pi的博客 1万+

sql update操作数据更新成功,返回的影响行数是0

以前使用sql server, mysql时候,本能以为update操作返回的行数能判断对记录的操作结果,除了数据库异常,一般确实能反应操作的真实情况,但是,为何却出现update数据更新成功,反而返回影响行数为0的情况呢? 以为可以判断返回值是否大于0来判断更新是否成功,但是,下面的两种情况均返回0: 1、没有找到需要更新的数据 ...

臣本布衣,躬耕于南阳 5万+

如何绘制电气绝缘图(GB9706.1-2007和GB9706.1-2020差异)

是用来描述要考虑设备的绝缘状况和它们的值 ,从而便于和相关部门交流和沟通,如权威机构和检测实验室等。本文为绝缘图的实例, 包括所有相关的绝缘路径以及介电强度,爬电距离和电气间隙的值。

学海无涯的专栏 1万+

代码的自由之旅:用AI写出无版权烦恼的Verilog

他们还基于这个数据集,训练了一个名叫“FreeV”的AI模型,不仅能写出好用的Verilog代码,还把版权侵权的风险降到了仅3%。为了让AI安全地写Verilog,研究团队提出了三个“法宝”:一个检测AI是否会生成侵权代码的测试方法、一个干净的Verilog数据集FreeSet,还有一个基于FreeSet训练的AI模型FreeV。AI的记忆力超强,能记住训练时见过的代码。测试发现,一些用Verilog数据训练过的AI,比如VeriGen,生成侵权代码的概率从9%涨到了15%,说明它们可能学了不该学的代码。

步子哥的博客 1808

SQL Server UPDATE JOIN 原理与工业级实战指南

UPDATE JOIN 是关系型数据库中实现跨表条件更新的核心技术,其本质是利用 JOIN 的索引查找能力完成高效行定位,而非先生成中间结果集再更新。该机制深刻影响事务一致性、锁粒度与执行计划生成逻辑,尤其在 SQL Server 中通过 FROM 子句显式绑定目标表,强化了数据操作的安全边界。相比子查询或游标,UPDATE JOIN 在千万级订单同步、用户标签批量修正等场景下,可将性能从分钟级压缩至秒级,并保障原子性与可审计性。本文聚焦 INNER JOIN 更新与 LEFT JOIN 更新的语义差异、索

319

【WRF数据介绍第一期】静态地理数据介绍及下载

WRF数据介绍第一期:静态地理数据介绍及下载

WW、forever的博客 4810

SQL Server 致程序员(容易忽略的错误)

记住,一个优秀的程序员不仅要写出正确的代码,还要考虑数据库的执行效率。然而,在日常开发中,许多看似简单的错误却容易被忽略,导致性能瓶颈、数据不一致甚至系统崩溃。没有索引的查询可能导致全表扫描,当数据量达到百万级时,性能会急剧下降。## 4. 忽略字符串中的特殊字符SQL 注入是程序员最熟悉的攻击方式,但很多人在拼接 SQL 语句时仍会忽略单引号等特殊字符。### 另一个常见错误:隐式类型转换当查询条件中的数据类型与列类型不匹配时,SQL Server 会进行隐式转换,这也会导致索引失效。

oRxF477FJ的博客 175

Qt EGLFS 图形后端详解

EGLFS (EGL Full Screen) 是Qt框架在嵌入式Linux系统中的高性能图形显示后端,它提供了直接基于EGL和OpenGL ES的硬件加速渲染解决方案。

浩瀚之水的专栏 511

QT实现计算器(C/C++)

digitClicked()槽函数用于处理数字按钮的点击事件,operatorClicked()槽函数用于处理运算符按钮的点击事件,equalsClicked()槽函数用于处理等号按钮的点击事件。在operatorClicked()槽函数中,我们获取被点击按钮的文本作为当前运算符,并将文本框中的内容转换为双精度浮点数,存储为操作数1。在上述代码中,我们添加了一个私有成员变量m_operand1,用于存储第一个操作数的值,以及一个私有成员变量m_currentOperator,用于存储当前运算符的值。

CyberNova的博客 385

SQL Server触发器实战:基于UPDATE与INSERT实现库存数据自动同步

在数据库系统中,触发器是一种重要的自动化机制,它能在数据发生变更时自动执行预定义的操作。其工作原理类似于条件反射,当绑定的表发生INSERT、UPDATE或DELETE事件时,数据库会立即响应,通过访问inserted和deleted这两个关键临时表来捕获变化前后的数据状态。这一机制的核心技术价值在于将数据一致性的维护逻辑从应用层下沉至数据库层,从而提升系统的可靠性与内聚性。在工程实践中,触发器常被用于实现跨表数据同步、审计日志记录和实时汇总计算等场景。例如,在库存管理系统中,通过创建AFTER UPDAT

weixin_34221276的博客 367

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

update nowait

Oracle中避免排队的唯一方式是使用SELECT ... FOR UPDATE(子句WAIT/NOWAIT)命令。 oracle锁的排队机制:    请求锁定需要排队。如果某个会话请求一个锁定,但是由于其他会话已经锁定了指定记录或对象而无法获得所需的锁定,那么这个会话将会等待。    此时,可能多个会话都在等待访问相同记录或对象,在这种情况下,ORACLE会跟踪这些会话请求锁定的顺

经验分享--我们都在成长 2968

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

sql server升级打补丁

原本:https://blog.youkuaiyun.com/kk185800961/article/details/72436415 sql server升级 sql server打补丁 sql server升级打补丁 SQLServer怎么升级补丁?一直以来打算整理 SQL Server 补丁资料,刚好今天有事醒的早,于是把之前的资料整理一下。在入DBA这坑以来,开始那一两年,甚...

weixin_30776545的博客 4906

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

sql server update 两列相加_SQL · 19道表操作的实战题

本文大部分知识点和前一篇文中相同,其他新知识点主要是关于表操作:建表:设置主键和变量的默认值,Q4插入数据,Q5、Q6生成列索引,Q8,Q10创建视图,Q9alter 语句表中插入一列,Q11构造触发器,Q12delete 语句删除重复记录,Q13替换:update 语句、replace,Q14,Q15alter 语句重命名,Q16设置外键,Q17update ... set 批量修改,Q18--...

weixin_39827585的博客 1017

Flink CDC实战踩坑记录:处理SQL Server和MySQL的UPDATE事件时,我的数据为什么对不上?

本文深入解析Flink CDC在处理SQL Server和MySQL的UPDATE事件时常见的数据不一致问题,揭示多源同步中的关键差异与陷阱。通过实战案例展示如何正确处理CDC事件,包括字段过滤、变更检测和幂等写入等优化策略,帮助开发者实现高效可靠的数据同步。

weixin_29034963的博客 140

MySQL与标准SQL的不同

我们尽力使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但在某些情况下,MySQL Server会以不同的方式执行操作。

hay23455的博客 1306
上一篇: 是什么引起执行计划变得极其糟糕? 应该使用更新统计信息来解决它吗?
下一篇: 生成索引信息及索引创建脚本
黑暗中的光芒
博客等级 码龄12年 12粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值