sql - Group By 使查询变得天文数字般更长

标签 sql optimization db2 squirrel-sql

*首先请注意,我只有服务器的读取权限。只是,仅供引用,因为它似乎出现了很多......

服务器: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/

相关文章:

javascript - PHP添加JavaScript函数将数据返回到数据库

db2 - SQLRPGLE 中 OPEN 游标上的 SQL -302

sql - Sencha Mysql 查询

numpy - 加速矩阵求逆

python - 是否有构建和组织 Django 模型的 'good' 方法?

optimization - 支持向量机原始形式实现

sql - 如何将小数日期转换为 where 语句中的日期字段?

db2 - 对名称中带有点 "."的 DB2 文件运行 SQL 查询?

php - 命令不同步;你现在不能运行这个命令

mysql - SQL 订单字符串作为数字