- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在sql中执行更新语句,但仅在更新不同时才更新?
例如
如果在数据库中,col1 = "hello"
update table1 set col1 = 'hello'
不应执行任何类型的更新
但是,如果
update table1 set col1 = "bye"
这应该执行更新。
最佳答案
在查询编译和执行期间,SQL Server 不会花时间来确定 UPDATE 语句是否会实际更改任何值。它只是按预期执行写入,即使是不必要的。
在这样的场景
update table1 set col1 = 'hello'
您可能认为 SQL 不会执行任何操作,但它会执行所有必要的写入操作,就像您实际更改了值一样。对于物理表(或聚集索引)以及该列上定义的任何非聚集索引都会发生这种情况。这会导致写入物理表/索引、重新计算索引和事务日志写入。处理大型数据集时,仅更新将接收更改的行具有巨大的性能优势。
如果我们想在不必要的时候避免这些写入的开销,我们必须设计一种方法来检查是否需要更新。检查是否需要更新的一种方法是添加类似“where col <> 'hello'”的内容。
update table1 set col1 = 'hello' where col1 <> 'hello'
但在某些情况下,这不会很好地执行,例如,如果您要更新包含许多行的表中的多个列,并且实际上只有这些行的一小部分子集的值会发生更改。这是因为需要对所有这些列进行过滤,并且非等式谓词通常无法使用索引查找,以及如上所述的表和索引写入以及事务日志条目的开销。
但是有一个更好的替代方案,使用 EXISTS 子句与 EXCEPT 子句的组合。其想法是将目标行中的值与匹配源行中的值进行比较,以确定是否确实需要更新。查看下面修改后的查询并检查以 EXISTS 开头的附加查询过滤器。请注意 EXISTS 子句内部的 SELECT 语句没有 FROM 子句。该部分特别重要,因为这只会在查询计划中添加额外的常量扫描和过滤操作(两者的成本都很小)。因此,您最终得到的是一种非常轻量级的方法,用于确定是否需要更新,从而避免不必要的写入开销。
update table1 set col1 = 'hello'
/* AVOID NET ZERO CHANGES */
where exists
(
/* DESTINATION */
select table1.col1
except
/* SOURCE */
select col1 = 'hello'
)
当您使用文字值更新表中所有行的一个值时,与在原始问题中的简单场景中检查简单 WHERE 子句中的更新相比,这看起来过于复杂。但是,如果您要更新表中的多个列,并且更新源是另一个查询,并且您希望最大限度地减少写入和事务日志条目,则此技术非常有效。它的性能也比使用 <> 测试每个字段更好。
更完整的示例可能是
update table1
set col1 = 'hello',
col2 = 'hello',
col3 = 'hello'
/* Only update rows from CustomerId 100, 101, 102 & 103 */
where table1.CustomerId IN (100, 101, 102, 103)
/* AVOID NET ZERO CHANGES */
and exists
(
/* DESTINATION */
select table1.col1
table1.col2
table1.col3
except
/* SOURCE */
select z.col1,
z.col2,
z.col3
from #anytemptableorsubquery z
where z.CustomerId = table1.CustomerId
)
关于sql - 如果不同/更改则更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6677517/
SO亲爱的 friend 们: 2014 年 3 月 18 日。我正在处理一种情况,在使用 ng-repeat 时,数组内的元素(我从 Json 字符串中获取)更改了原始顺序。 需要明确的是,数组中的
有很多问题询问如何在 JavaScript 单击处理程序中更改 div 的类,例如,此处:Change Div style onclick .我理解得很好(只需更改 .className),并且它有效
我从access导入了一个数据库到mysql,但其中一个表的列名“股数”带有空格,但我尝试更改、替换甚至删除列名,但失败了。任何人都可以帮助解决这一问题 String UpdateQuary = "U
我正在做一个随机的学校元素。 目前,我有一个包含两个 CSS 的页面。一种用于正常 View ,一种用于残障人士 View 。 此页面还包括两个按钮,它们将更改使用的样式表。 function c
我需要使用 javascript 更改 HTML 元素中的文本,但我不知道该怎么做。 ¿有什么帮助吗? 我把它定义成这样: Text I want to change. 我正在尝试这样做: docum
我在它自己的文件 nav_bar.shtml 中有一个主导航栏,每个其他页面都包含该导航栏。这个菜单栏是一个 jQuery 菜单栏(ApyCom 是销售这些导航栏的公司的名称)。导航栏上的元素如何确定
我正在摆弄我的代码,并开始想知道这个变化是否来自: if(array[index] == 0) 对此: if(!array[index] != 0) 可能会影响任何代码,或者它只是做同样的事情而我不需
我一直在想办法调整控制台窗口的大小。这是我正在使用的函数的代码: #include #include #define WIDTH 70 #define HEIGHT 35 HANDLE wHnd;
我有很多情况会导致相同的消息框警报。 有没有比做几个 if 语句更简单/更好的解决方案? PRODUCTS BOX1 BOX2 BOX3
我有一个包含这些元素的 XELEMENT B Bob Petier 19310227 1 我想像这样转换前缀。 B Bob Pet
我使用 MySQL 5.6 遇到了这种情况: 此查询有效并返回预期结果: select * from some_table where a = 'b' and metadata->>"$.countr
我想知道是否有人知道可以检测 R 中日期列格式的任何中断的包或函数,即检测日期向量格式更改的位置,例如: 11/2/90 12/2/90 . . . 15/Feb/1990 16/Feb/1990 .
我希望能够在小部件显示后更改 GtkButton 的标签 char *ButtonStance == "Connect"; GtkWidget *EntryButton = gtk_button_ne
我正在使用 Altera DE2 FPGA 开发板并尝试使用 SD 卡端口和音频线路输出。我正在使用 VHDL 和 C 进行编程,但由于缺乏经验/知识,我在 C 部分遇到了困难。 目前,我可以从 SD
注意到这个链接后: http://www.newscientist.com/blogs/nstv/2010/12/best-videos-of-2010-progress-bar-illusion.h
我想知道在某些情况下,即使剧本任务已成功执行并且 ok=2,ansible 也会显示“changed=0”。使用 Rest API 和 uri 模块时会发生这种情况。我试图找到解释但没有成功。谁能告诉
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicate: add buttons to push notification alert 是否可以在远程通知显示的警报框中指定有
当您的 TabBarController 中有超过 5 个 View Controller 时,系统会自动为您设置一个“更多” View 。是否可以更改此 View 中导航栏的颜色以匹配我正在使用的颜
如何更改.AndroidStudioBeta文件夹的位置,默认情况下,该文件夹位于Windows中的\ .. \ User \ .AndroidStudioBeta,而不会破坏任何内容? /编辑: 找
我目前正在尝试将更具功能性的编程风格应用于涉及低级(基于 LWJGL)GUI 开发的项目。显然,在这种情况下,需要携带很多状态,这在当前版本中是可变的。我的目标是最终拥有一个完全不可变的状态,以避免状
我是一名优秀的程序员,十分优秀!