*首先请注意,我只有服务器的读取权限。只是,仅供引用,因为它似乎出现了很多......
服务器: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 究竟出了什么问题?
我用 Google 搜索了 WHERE 语句优化,但似乎找不到任何东西。非常欢迎所有链接和解释。
对这样的新手帖子表示歉意……我们都必须从某个地方开始,对吧?
(*)使用 SQLExplorer,我的 IDE,Squirrel SQL 的 Eclipse 实现。
最佳答案
当查询中没有聚合函数时,我不确定服务器如何处理group by
。根据您在评论中的回答,我只是尝试添加这些:
SELECT
...,
SUM(SalesCost) as SalesCost,
SUM(SalesDollars) as SalesDollars
FROM
...
保留查询的其余部分不变。
如果这不能解决问题,则可能缺少索引。我会尝试找出是否存在一个索引,其中 WEEK_ID 是唯一的列或,其中它是第一列。您还可以检查已索引的同一个表上是否有另一个时间列(即 TransactionDate 或类似的列)。如果是这样,您可以在 where
子句中使用它。
如果没有正确的索引,数据库服务器将被迫执行完整的表扫描,这可以解释您的性能问题。从磁盘读取 3900 万行确实需要花费不少时间。
还要检查 WEEK_ID 的数据类型是否为 int
或类似类型,以避免查询中不必要的转换。
为了避免对 Category 表进行表扫描,您需要确保 Category_Number 也已建立索引。 (它可能已经是,因为我认为它是该表的关键。)
关于sql - Group By 使查询变得天文数字般更长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844705/