在执行SQL更新之前进行何处筛选的好处

在执行SQL更新之前进行何处筛选的好处,sql,sql-server,Sql,Sql Server,我的目标RDBMS是SQL Server 2012,但我对这里的一般响应感兴趣 让我们考虑下面的SQL更新子句: UPDATE MyTable SET Active = 0 WHERE EffectiveDate < GETDATE() 假设MyTable中可能有许多条目,其中Active对于过去的事件已经设置为0,那么这样执行更新会有巨大的性能优势吗 UPDATE MyTable SET Active = 0 WHERE EffectiveDate < GETDATE() AND

我的目标RDBMS是SQL Server 2012,但我对这里的一般响应感兴趣

让我们考虑下面的SQL更新子句:

UPDATE MyTable SET Active = 0 WHERE EffectiveDate < GETDATE()
假设MyTable中可能有许多条目,其中Active对于过去的事件已经设置为0,那么这样执行更新会有巨大的性能优势吗

UPDATE MyTable SET Active = 0 WHERE EffectiveDate < GETDATE() AND Active = 1
是的,会的

正如您所说的,有许多条目的Active=0,因此将更新查询限制为只有不具有Active=0的记录,这意味着查询将更少。

是的


正如您所说,有许多条目的Active=0,因此将更新查询限制为只有不具有Active=0的记录,这意味着查询将更少。

您可能会有更少的写入,因为您声明大多数记录已经是0?如果在活动状态下有索引,则对索引的更新会更少,因为您声明大多数索引已为0,所以写入的次数可能会更少?如果您的索引处于活动状态,那么对索引的更新就会更少。最大的节省可能是写入日志。正在更新的每一行都会生成日志记录。通过更新更少的行,您将记录更少的更改


正如不久前在另一个问题中提到的,避免这些更新可以简化触发器的一些神秘方面。UpdateColumn语法会将该列标识为正在修改,即使值没有更改。

最大的节省可能是写入日志。正在更新的每一行都会生成日志记录。通过更新更少的行,您将记录更少的更改



正如不久前在另一个问题中提到的,避免这些更新可以简化触发器的一些神秘方面。UpdateColumn语法会将该列标识为正在修改,即使该值没有更改。

要在其他答案中再添加一点:如果有更新触发器,则会有所不同,因为它只会对满足WHERE条件的行触发。根据触发器内容的不同,这可能会导致不希望出现的效果。

在其他答案上再添加一点:如果有更新触发器,则会有所不同,因为它只会为满足WHERE条件的行触发。取决于触发器内容,这可能会导致不期望的效果。

取决于索引的制作方式。Crono-我高度怀疑可能是这种情况。我猜在这样的情况下,一般的最佳实践是使用我的第二个变体-正确吗?很可能,是的。但若您的表有数百万条记录,并且活动字段上并没有索引,那个么您可能会开始感觉到不同。我建议你首先确保活动字段被索引,然后是的,你的第二个变量将是最好的方法。这取决于你的索引是如何建立的。克罗诺-我高度怀疑可能是这样。我猜在这样的情况下,一般的最佳实践是使用我的第二个变体-正确吗?很可能,是的。但若您的表有数百万条记录,并且活动字段上并没有索引,那个么您可能会开始感觉到不同。我建议您确保首先对活动字段进行索引,然后是的,您的第二个变量将是最佳方法。我想您已经提到了我的要点—如果列已经具有所需的值,SQL server是否实际执行写入操作?我不确定它是否足够聪明,可以从本质上执行这些类型的优化。即使值相同,它也会写入,是的。@Crono-通常不会写入,除非更新CI键或使用快照隔离。见我站直了这篇文章不错,我以后一定会更深入地阅读。谢谢@克罗诺-是的。如果表具有更新触发器,则即使未更改,逻辑更新的行仍需要复制到这些行。问题中的第二句话肯定是最好的,我想你已经提到了我的要点——如果列已经具有所需的值,SQL server是否真的执行了写操作?我不确定它是否足够聪明,可以从本质上执行这些类型的优化。即使值相同,它也会写入,是的。@Crono-通常不会写入,除非更新CI键或使用快照隔离。见我站直了这篇文章不错,我以后一定会更深入地阅读。谢谢@克罗诺-是的。如果表具有更新触发器,则即使未更改,逻辑更新的行仍需要复制到这些行。问题中的第二条语句肯定是最好使用的。这并不意味着nag,但触发器中的update函数将返回相同的内容,而不管WHERE子句是什么:不过,日志大小为+1。触发器是每个语句,而不是每行。updatecolumn仅在列被分配给的情况下返回true。这并不意味着nag,但触发器中的update函数将返回相同的内容,而不管WHERE子句是什么:不过,对数大小为+1 装配工是按语句而不是按行装配的。如果列被分配给,updatecolumn只返回true。