SQL Server Where子句

SQL Server Where子句,sql,sql-server,Sql,Sql Server,使用多个where语句运行select查询时(在SQL SERVER 2000+上),例如 SELECT * FROM TABLE1 WHERE TableId = @TableId AND Column1 = @Column1 AND Column2 = @Column2 AND Column3 = @Column3 etc. …即使第一个where子句不相等,查询是否也会计算每个where子句?我有

使用多个where语句运行select查询时(在SQL SERVER 2000+上),例如

SELECT    * 
FROM      TABLE1
WHERE     TableId = @TableId 
          AND Column1 = @Column1 
          AND Column2 = @Column2 
          AND Column3 = @Column3 etc.
…即使第一个where子句不相等,查询是否也会计算每个where子句?我有一个查询,在更新之前检查每一列,看看是否有任何更改(即,只有在有更改时才会更新)。如果查询比较了每一列,那么我想我需要重写查询。但是,如果查询引擎首先过滤到ID列,然后在该过滤集中单独比较每一列,那么性能应该是良好的(我会认为是这样的)

我希望这是有道理的

谢谢, 詹姆斯。不

查询引擎得到了很好的优化。


查询引擎得到了很好的优化。

根据统计数据和可用索引,优化者将估计计算查询的最佳顺序。大多数情况下,它是正确的,但也可能被过时的统计数据所抛弃


您不应该关心WHERE子句的顺序。相反,请查看为查询创建的实际执行计划。

根据统计数据和可用索引,优化人员将估计计算查询的最佳顺序。大多数情况下,它是正确的,但也可能被过时的统计数据所抛弃


您不应该关心WHERE子句的顺序。相反,请看一看为查询创建的实际执行计划。

为什么要用以下命令两次命中数据:

--did data change?
if exists (select ... where pk=@pk and and and...)
begin
    update ... where pk=@pk
end
update ... where pk=@pk and and and...
只需做如下操作:

--did data change?
if exists (select ... where pk=@pk and and and...)
begin
    update ... where pk=@pk
end
update ... where pk=@pk and and and...

如果您需要知道它是否实际更改和更新了,可以检查@@ROWCOUNT

为什么要用类似以下内容的命令两次命中数据:

--did data change?
if exists (select ... where pk=@pk and and and...)
begin
    update ... where pk=@pk
end
update ... where pk=@pk and and and...
只需做如下操作:

--did data change?
if exists (select ... where pk=@pk and and and...)
begin
    update ... where pk=@pk
end
update ... where pk=@pk and and and...

您可以检查@@ROWCOUNT,如果您需要知道它是否实际更改和更新了

我不知道在您的情况下是否可以这样做,但请尝试以下方法:

在正在查看的表/数据集上,创建LastModified datetime default getdate()列。然后创建一个触发器以更新该表。让触发器执行以下操作

更新 set LastModified=getdate()

这是一个很好的数据库设计,您可以为LastModified列编制索引。这是一个要维护的较窄索引,您的查询现在可以

UPDATE... WHERE LastModifed >= @LastRunDate

有关触发器的帮助,请尝试此堆栈溢出线程:

我不知道在您的情况下是否可以这样做,但请尝试以下操作:

在正在查看的表/数据集上,创建LastModified datetime default getdate()列。然后创建一个触发器以更新该表。让触发器执行以下操作

更新 set LastModified=getdate()

这是一个很好的数据库设计,您可以为LastModified列编制索引。这是一个要维护的较窄索引,您的查询现在可以

UPDATE... WHERE LastModifed >= @LastRunDate

有关触发器的帮助,请尝试此堆栈溢出线程:

谢谢。我最终以不同的方式修改了我的查询,但我感谢您的建议。谢谢。我最终以不同的方式修改了我的查询,但我感谢您的建议。