以下两条SQL语句(不会导致净变化的更新)在现实世界中是否存在任何差异

以下两条SQL语句(不会导致净变化的更新)在现实世界中是否存在任何差异,sql,sql-server,query-optimization,Sql,Sql Server,Query Optimization,假设我有一个100万行的表,让我们假设特定列的50%为null(所以500k null和500k non null)。我想把所有的行都设为空 假设没有索引来简化域 UPDATE MyTable SET MyColumn = NULL 或 逻辑表明后者更有效。但是,优化器不会意识到第一个条件与第二个条件相同,并且设置仅引用MyColumn。优化器不会意识到第一个条件与第二个条件相同 你应该使用第二种形式。第一个表单将记录对记录的更改,这些更改在某些情况下实际上没有更改(但在

假设我有一个100万行的表,让我们假设特定列的50%为null(所以500k null和500k non null)。我想把所有的行都设为空

假设没有索引来简化域

UPDATE 
    MyTable 
SET 
    MyColumn = NULL


逻辑表明后者更有效。但是,优化器不会意识到第一个条件与第二个条件相同,并且设置仅引用MyColumn。

优化器不会意识到第一个条件与第二个条件相同


你应该使用第二种形式。第一个表单将记录对记录的更改,这些更改在某些情况下实际上没有更改(但在这种特定情况下可能没有更改)。这是一个很好的参考。优化器不会意识到第一个和第二个是一样的


你应该使用第二种形式。第一个表单将记录对记录的更改,这些更改在某些情况下实际上没有更改(但在这种特定情况下可能没有更改)。这是一个很好的参考。

优化器针对SELECT语句工作。
优化器不会影响表的更新方式。
当您要求SQL Server更新每一行时,它将更新每一行 因为你影响了每一行,所以做这件事也需要更长的时间;我相信这也会影响您的事务日志

小心不要这样做。
发生这种情况时,您将在整个表中的每条记录上创建独占锁。
即使数据没有实际更改,SQL Server仍将更新记录。
如果另一个进程在此期间尝试使用该表,则该可能会导致该表死锁。

根据我的经验,每天晚上我们的主数据库表都会锁定15分钟,而一个进程(其他人写的)正在更新整个表。。。两次。
这导致所有其他查询等待它完成(有些查询将超时)。

更新时,即使是简单的Select语句也不能对其运行。

优化器可以对Select语句运行。
优化器不会影响表的更新方式。
当您要求SQL Server更新每一行时,它将更新每一行 因为你影响了每一行,所以做这件事也需要更长的时间;我相信这也会影响您的事务日志

小心不要这样做。
发生这种情况时,您将在整个表中的每条记录上创建独占锁。
即使数据没有实际更改,SQL Server仍将更新记录。
如果另一个进程在此期间尝试使用该表,则该可能会导致该表死锁。

根据我的经验,每天晚上我们的主数据库表都会锁定15分钟,而一个进程(其他人写的)正在更新整个表。。。两次。
这导致所有其他查询等待它完成(有些查询将超时)。

更新时,即使是简单的Select语句也无法对其运行。

该列上有索引吗?理想情况下,我们应该在索引上进行筛选,因为这会将查询从表搜索更改为表扫描。@JayG-请参阅问题我假设此问题没有索引。列上有索引吗?理想情况下,我们应该在索引上进行筛选,因为这会将查询从表搜索更改为表扫描。@JayG-请参阅问题我假设此问题没有索引非更新(相同值到相同值)不会(始终)导致日志条目。和往常一样,这要视情况而定。例如,参见Paul White的博客了解更多信息:谢谢@deroby。这对我的专业水平较低的人来说有点让人困惑我确实提到我“相信”它会影响事务日志。我认为可以肯定地说,在大多数情况下,你应该在假设会发生的情况下进行操作。在我的例子中,我们工作的第三方数据库在其所有表中使用时间戳字段,因此,无论数据在更新过程中是否发生更改,我“知道”它都会影响时间戳,因此每次都会影响我们的日志。绝对!无论如何,我只是想给你指出一些额外的细节,因为你用了“相信”。。。愚蠢的是,我现在才意识到戈登下面的答案已经包含了相同的链接。。。我现在觉得有点傻=)不更新(相同的值到相同的值)不会(总是)导致日志条目。和往常一样,这要视情况而定。例如,参见Paul White的博客了解更多信息:谢谢@deroby。这对我的专业水平较低的人来说有点让人困惑我确实提到我“相信”它会影响事务日志。我认为可以肯定地说,在大多数情况下,你应该在假设会发生的情况下进行操作。在我的例子中,我们工作的第三方数据库在其所有表中使用时间戳字段,因此,无论数据在更新过程中是否发生更改,我“知道”它都会影响时间戳,因此每次都会影响我们的日志。绝对!无论如何,我只是想给你指出一些额外的细节,因为你用了“相信”。。。愚蠢的是,我现在才意识到戈登下面的答案已经包含了相同的链接。。。我现在觉得有点傻=)
UPDATE 
    MyTable 
SET 
    MyColumn = NULL 
WHERE 
    MyColumn IS NOT NULL