1

有没有办法根据 WHERE 过滤器优化这个查询?出于兼容性原因,我不能使用计算列。除此之外,我接受任何建议:

UPDATE #ATempTable
   SET SomeTotal = (QuantityA + QuantityB + QuantityC) 
 - (dbo.fmin(dbo.fmax(ISNULL(ValueA,0)
  ,dbo.fmax(ISNULL(ROUND(ValueB,0),0)
 , ISNULL(ValueC,0))), ISNULL(round(ValueD,0), 9999999)))

 WHERE QuantityA + QuantityB + QuantityC > 
 (dbo.fmin(dbo.fmax(ISNULL(ValueA,0)
  ,dbo.fmax(ISNULL(ROUND(ValueB,0),0)
 , ISNULL(ValueC,0))), ISNULL(round(ValueD,0), 9999999)))

我正在使用 SQL Server 2008 R2。fmax并且fmin是用户定义的函数,它们分别返回两个给定值中的最大值和最小值,并且不受模式限制。

编辑:附加信息

#ATempTable 是由应用程序调用的过程中的临时表,SomeTotal、QuantityA/B/C 和 ValueA/B/C/D 都是该表的字段。不,代码不是那样的,我重命名了字段。

4

2 回答 2

2

SQL Server 2008 R2 支持索引视图。您可能希望在基表上创建一个视图并在其中定义总和列,然后在其上创建索引。这将大大减少过滤时间。

于 2013-04-23T16:12:37.690 回答
0

创建表时,我建议您在where子句中添加一个具有差异的列:

diff = (QuantityA + QuantityB + QuantityC) -
 (dbo.fmin(dbo.fmax(ISNULL(ValueA,0)
  ,dbo.fmax(ISNULL(ROUND(ValueB,0),0)
 , ISNULL(ValueC,0))), ISNULL(round(ValueD,0), 9999999)));

然后,您可以在新列(我称之为diff)上添加索引。这将加快你的update陈述。

于 2013-04-23T17:39:46.637 回答