2

*作为第一个说明,我只有对我的服务器的读取权限。只是,仅供参考,因为它似乎出现了很多......

服务器:DB2(6.1) for i (IBM)

我有一个查询,我在一个有 1900 万行的表上运行(我不设计它们,我只是查询它们)。我一直将我的返回数据限制为 10 行 (*),直到我整理出这个查询,以便返回时间更合理一些。

基本设计是我需要获取有关我们每周销售的产品类别的数据,使用列:WEEK_ID 和 CATEGORY。这是示例代码(带有一些重要的位####。)

SELECT WEEK_ID, CATEGORY
FROM DWQ####.SLSCATW
INNER JOIN DW####.CATEGORY
ON DWQ####.SLSCATW.CATEGORY_NUMBER = DW####.CATEGORY.CATEGORY_NUMBER
WHERE WEEK_ID  
BETWEEN 200952 AND 201230 --Format is year/week
GROUP BY WEEK_ID, CATEGORY

如果我注释掉最后一行,我可以在 254 毫秒内取回 100 行。如果我把这条线放回我的回报中需要的时间比我有耐心等待的时间要长:-)。(我等的最长的时间是 10 分钟。)

这个问题有两个部分。第一个问题很初级:这正常吗?我试图浓缩到 50 个类别(大约)和 140 周(左右)。我意识到要从 1900 万行中压缩很多信息,但我希望将查询限制为返回的 10 行可以最大限度地减少时间?

而且,如果我不只是一个完整的 n00b,而且这实际上不需要几分钟,那么我的 SQL 到底有什么问题?

我用谷歌搜索了 WHERE 语句优化,似乎找不到任何东西。非常欢迎所有链接和解释。

为这样一个新手帖子道歉......我们都必须从某个地方开始,对吧?

(*)使用 SQLExplorer,我的 IDE,Squirrel SQL 的 Eclipse 实现。

4

2 回答 2

2

group by当查询中没有聚合函数时,我不确定服务器如何处理。根据您在评论中的回答,我将尝试添加以下内容:

SELECT
    ...,
    SUM(SalesCost) as SalesCost,
    SUM(SalesDollars) as SalesDollars
FROM
    ...

保持查询的其余部分不变。

如果这不能解决问题,您可能缺少索引。我会尝试找出 WEEK_ID 是唯一列还是第一的索引。您还可以检查在同一个表上是否有另一个临时列(即 TransactionDate 或类似的东西)已经被索引。where如果是这样,您可以在子句中使用它。

如果没有正确的索引,数据库服务器将被迫进行完整的表扫描,这可以解释您的性能问题。从磁盘读取 3900 万行确实需要一些不小的时间。

还要检查 WEEK_ID 的数据类型是否为int或类似,以避免在查询中进行不必要的强制转换。

为了避免对 Category 表进行表扫描,您需要确保 Category_Number 也被索引。(它可能已经是,因为我认为它是该表的键。)

于 2012-12-12T17:11:25.240 回答
0

WEEK_ID、CATEGORY(可能还有 CATEGORY_NUMBER)上的索引是使其真正快速的唯一方法,因此您需要说服 DBO 引入这些索引。

于 2012-12-12T21:49:46.380 回答