sql - T-SQL - 更新未更改的值,是否已执行工作?

标签 sql sql-server t-sql merge

这是我在这里的第一个问题,所以请对我轻松点:)....我尝试在网上搜索,以及这里的其他已回答的问题,但我想不出一个好方法这个词足够短,足以让 Google 找到任何好的匹配项。对我来说这似乎是一个 T-SQL 101 问题。

我的问题是,在T-SQL中,执行更新时,如果新值等于当前值,是否仍执行写入(即工作完成了吗?)。

在我的工作中,当我们进行更新/合并时,很多时候我们会使用如下代码来进行更新(请记住,通常合并/更新是针对多列,而不仅仅是一列,就像这样示例):

[列] = 案件 WHEN ISNULL(source.[Column],'') = '' THEN target.[Column] 其他来源。[专栏] 结束

或者像这样

[Column]= COALESCE(NULLIF(source.[Column], ''),target.[Column])

所以,换句话说,如果源列值为空,则将其设置为目标列值...我一直很好奇 T-SQL 是否足够聪明来说...嘿...他们只是想把它设置为自己,管它呢。

此外,这可以分为两个问题...... 如果新值等于目标值,则执行工作,其中...

  1. 新值是否引用目标值? (意思是,TSQL 是否足够聪明,可以看到它是对自身的引用)
  2. 新值等于源值吗?

我希望这不是太复杂和深思熟虑。

最佳答案

根据 SQL Server Profiler 对一些实验性 UPDATE 语句的跟踪来看,是的,工作已经执行,但数据库引擎正如预期的那样非常智能。

实验性UPDATE语句

我在 4 次运行中跟踪了 SQL Server Profiler 中的以下每个 UPDATE 语句,以稍微不同的顺序运行它们,以最大限度地减少其执行顺序作为跟踪结果的一个因素:

更新 1

update [table]
set CustomerName = CustomerName
where CustomerName = 's/O'; -- value changed from 's/O' to 'o/S' on some runs

更新 2

update [table]
set CustomerName = 's/O'    -- value changed from 's/O' to 'o/S' on some runs
where CustomerName = 's/O'; -- value changed from 's/O' to 'o/S' on some runs

更新 3

update [table]
set CustomerName = 'o/S'    -- value changed from 'o/S' to 's/O' on some runs
where CustomerName = 's/O'; -- value changed from 's/O' to 'o/S' on some runs

根据我在每个 UPDATE 旁边的评论,我在运行期间在 's/O''o/S' 之间翻转为每次运行提供一个实际影响我的目标表[table]的值。我可以在每次运行后重置表中的值,但这正是我碰巧这样做的。

SQL Server Profiler 跟踪结果

放大浏览器可能会更容易阅读以下屏幕截图中的数字。屏幕截图后面还提供了每个 UPDATE 语句执行的平均工作的更易于阅读的文本摘要。

运行 1(更新 1、更新 2、更新 3)

SQL Profiler - Updates with Same Values vs. Different Values as Target Values (Run 1)

这次运行是一次热身。 SQL Server 之前在我的机器上处于闲置状态:所以对此持保留态度。

运行 2(更新 3、更新 1、更新 2)

SQL Profiler - Updates with Same Values vs. Different Values as Target Values (Run 2)

运行 3(更新 3、更新 2、更新 1)

SQL Profiler - Updates with Same Values vs. Different Values as Target Values (Run 3)

运行 4(更新 1、更新 2、更新 3)

SQL Profiler - Updates with Same Values vs. Different Values as Target Values (Run 4)

运行 1-4 分析

SQL Profiler - Updates with Same Values vs. Different Values as Target Values (Analysis)

运行 2-4 次平均值:

Update #    CPU     Reads    Writes    Duration
--------    ---     -----    ------    --------
1           0.00    13.00    1.00      11.33
2           0.00    2.33     1.00      6.67
3           0.00    17.33    1.00      20.00

关于sql - T-SQL - 更新未更改的值,是否已执行工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22725650/

相关文章:

sql - 如何用 SQL Server 中 nvarchar 字符串的单个换行符替换多个换行符

SQL 查询返回前 2 个值

sql - 使用 Union 和 Order By 不会出现重复项

sql - 函数返回表变量

java - DBMS_RANDOM 似乎不起作用

PHP:如何在单个查询中优化这些 MySQL 查询?

sql - 根据跨系统数据库中的唯一对象名称创建数字键?

php - 比较两个 SQL 查询结果集

sql - 按值组的连续日期范围对行进行分组

sql - 选择独特的列组合