2009-10-26 111 views
0

运行时有多个选择查询(在SQL SERVER 2000 +),语句如SQL Server的WHERE子句

SELECT * 
FROM  TABLE1 
WHERE  TableId = @TableId 
      AND Column1 = @Column1 
      AND Column2 = @Column2 
      AND Column3 = @Column3 etc. 

...没有查询计算where子句中的每一个,即使第一个不等于?我有一个查询,它在每次更新之前检查每个列是否有更改(即只有在有更改时才会更新)。如果查询比较每列,那么我想我需要重写查询。但是,如果查询引擎首先过滤到ID列,然后在该过滤集内单独比较每列,那么性能应该没问题(我会想到吗?)。

我希望这是有道理的。

谢谢, 詹姆斯。

回答

3

基于统计数据和可用索引,优化器将估计哪个是计算查询的最佳顺序。大多数情况下它是正确的,但可以通过过时的统计数据抛弃。

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

--did data change? 
if exists (select ... where [email protected] and and and...) 
begin 
    update ... where [email protected] 
end 

只是这样做::

+0

感谢。我最终以不同的方式修改了我的查询,但我非常感谢您的建议。 – 2009-10-29 09:29:54

2

编号

查询引擎已经很好地优化了。

0

为什么有像打两次数据

update ... where [email protected] and and and... 

您可以检查@@ ROWCOUNT,如果你需要知道,如果它实际上改变了更新

+0

好点。谢谢。 – 2009-10-29 09:30:38

0

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

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

在更新 集的LastModified = GETDATE()

这是良好的数据库设计,并且你可以索引上次更改列。这是为了维持较窄的指数,现在你的查询可以

UPDATE... WHERE LastModifed >= @LastRunDate 

如要了解触发器,试试这个堆栈溢出线程:Trigger Firing