0

我在 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)。

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

Sum(package.totalPce)

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

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

我从子请求中获得了 nbTooHumid 字段,并且我想在请求中获取的每个包都必须使用 UNION 从其他包中合并。

而且pieces 表有数百万个条目,所以,是的,这是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 ...)
)

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

4

1 回答 1

0

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

不过,总的来说,数字函数比查询所需的数据操作要快得多、快得多。所以,我真的怀疑这是性能问题。

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

但是,如果您真的需要性能方面的帮助,您应该发布整个查询。

于 2013-01-08T15:42:44.117 回答