在运行带有多个where语句(例如
)的select查询(在SQL SERVER 2000+上)时SELECT *
FROM TABLE1
WHERE TableId = @TableId
AND Column1 = @Column1
AND Column2 = @Column2
AND Column3 = @Column3 etc.
...查询是否会计算每个where子句,即使第一个子句不等同?我有一个查询,它在更新之前检查每个列以查看是否有任何更改(即只有在有更改时才更新)。如果查询比较每一列,那么我认为我需要重写查询。但是,如果查询引擎首先过滤到ID列,然后在该过滤集内单独比较每列,那么性能应该没问题(我原以为是吗?)。
我希望这是有道理的。
谢谢, 詹姆斯。
答案 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