SQL Server Where子句

时间:2009-10-26 10:56:28

标签: 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子句,即使第一个子句不等同?我有一个查询,它在更新之前检查每个列以查看是否有任何更改(即只有在有更改时才更新)。如果查询比较每一列,那么我认为我需要重写查询。但是,如果查询引擎首先过滤到ID列,然后在该过滤集内单独比较每列,那么性能应该没问题(我原以为是吗?)。

我希望这是有道理的。

谢谢, 詹姆斯。

4 个答案:

答案 0 :(得分:3)

根据统计信息和可用索引,优化器将估计哪个是计算查询的最佳顺序。大部分时间它都是正确的,但可能会被过时的统计数据抛弃。

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

答案 1 :(得分:2)

没有

查询引擎已经过很好的优化。

答案 2 :(得分:0)

为什么用以下的方式两次点击数据:

--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...

如果你需要知道它是否真的发生变化并且是UPDATEd,你可以查看@@ ROWCOUNT

答案 3 :(得分:0)

我不知道你的情况是否可行,但试试这个:

在您正在查看的表/数据集上,创建LastModified日期时间默认的getdate()列。然后为该表创建Update的触发器。触发器执行以下操作。

更新时 设置LastModified = getdate()

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

UPDATE... WHERE LastModifed >= @LastRunDate

有关触发器的帮助,请尝试此Stack溢出线程:Trigger Firing