有没有办法根据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是该表的所有字段。不,代码不是那样的,我重命名了字段。
答案 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
声明。