在查询中多次SUM(fieldX)的性能

时间:2013-01-08 15:36:45

标签: sql performance sum

我在VB中生成了一个很大的请求,它可能会变得很大......而且速度也很慢。

我有3种类型的碎片(1,2,3),我想要一包碎片的平均湿度 所以请求的标题如下:

SELECT package.id,
CASE WHEN Sum(package.totalPce) = 0 THEN 0 ELSE 
    Sum(nbTooHumid * package.totalPce) / Sum(package.totalPce) END as tooHumid,

然后我用nbTooDry而不是nbTooHumid做同样的事情,用HumidOk作为第三个。

另外,我也计算其他字段,也用Sum(package.totalPce)除法。

所以,我或多或少地打了十次电话:

Sum(package.totalPce)

我想知道是否减缓我的请求是否是一回事,因为  我的请求太长了,执行时间在5秒到2分钟之间变化。

编辑:我会在阅读戈登的回答后添加一个细节。

我从子请求中获取字段nbTooHumid,并且我想要在请求中获取的每个包都必须与其他具有UNION的包合并。

片段表有数百万个条目,所以,是的,这是IO的问题。

我将添加一个更完整的示例,以便您可以完整了解我的请求。

SELECT package.id,
CASE WHEN Sum(package.totalPce) = 0 THEN 0 ELSE 
    Sum(nbTooHumid * package.totalPce) / Sum(package.totalPce) END as tooHumid,
manyOtherFields
FROM 
((SELECT count(*) as totalPce, otherFields
FROM pieces 
WHERE idPackage = X and date between '2012-01-01' and '2012-01-11')
UNION
(SELECT ...)
)

请注意,这只是我的请求的平均格式,我没有使用确切的语法或字段名称。

1 个答案:

答案 0 :(得分:0)

性能问题肯定取决于您使用的数据库。

通常,数字函数比查询所需的数据操作要快得多,快得多。所以,我真的怀疑这是性能问题。

高度可变的执行时间表明两件事之一。正在使用的服务器正忙,从而减慢了查询速度。在这种情况下,您无法对慢速查询做很多事情。第二个是长跑是第一次跑,然后走得更快。这是因为数据库正在缓存内存中加载表。它不必为后续查询执行I / O.

但是,如果您真的需要有关性能的帮助,则应发布整个查询。