查询临时表,基于用户函数的计算,无连接,如何避免表扫描

时间:2013-04-23 16:03:57

标签: sql sql-server sql-server-2008-r2

有没有办法根据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。 fmaxfmin是用户定义的函数,分别返回两个给定值中的最大值和最小值,并且不受架构限制。

编辑:其他信息

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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声明。