Sql 通过使查询从天文角度上更长来分组

Sql 通过使查询从天文角度上更长来分组,sql,optimization,db2,squirrel-sql,Sql,Optimization,Db2,Squirrel Sql,*首先,我只有对服务器的读取权限。只是,仅供参考,因为它似乎出现了很多 服务器:IBM的DB26.1 我有一个查询,我在一个有1900万行的表上运行,我没有设计它们,我只是查询它们。我一直将返回数据限制为10行*,直到我整理好这个查询,以便返回时间更合理 基本设计是,我需要使用列:week_ID和CATEGORY来获取我们每周销售的产品类别的数据。下面是一些重要信息的示例代码 SELECT WEEK_ID, CATEGORY FROM DWQ####.SLSCATW INNER JOIN DW#

*首先,我只有对服务器的读取权限。只是,仅供参考,因为它似乎出现了很多

服务器:IBM的DB26.1

我有一个查询,我在一个有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,SquirrelSQL的Eclipse实现。

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

SELECT
    ...,
    SUM(SalesCost) as SalesCost,
    SUM(SalesDollars) as SalesDollars
FROM
    ...
保留查询的其余部分

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

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

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


为了避免在Category表上进行表扫描,您需要确保Category\u编号也已编制索引。它可能已经是了,因为我认为它是该表的一个键。

关于周ID、类别以及可能的类别编号的索引是使其真正快速的唯一方法,因此您需要说服DBO引入这些索引

为什么要分组?我看不到任何聚合…?你真的在寻找不同的,有可能吗?好问题。对于每个日期/类别组合,至少有几千个条目是不同的,至少在考虑表上的所有信息时。但是对于我要提取的数据,我不关心那些不同的列,所以我尝试折叠这些行。我应该改用Select Distinct吗?既然我没有收回不同的行?…那么您的查询的预期结果是什么?@您的第二条评论-哦,也许吧。让我试试。我添加了聚合,并能够在26秒内拉下大约1000000条记录。整个数据库有36Mil条记录,而不是之前引用的190 mil条记录。所以,理论上,整个过程应该在15分钟内完成我现在正在测试我的理论。看起来还是很慢。。。还是这正常?我不会说正常。。。where子句限制需要处理的数据量,但这仅在对WEEK_ID进行索引时有效,否则仍需要进行完整的表扫描。是否需要内部连接?我之所以这么问,是因为我不知道SalesCost/SalesDollars列是从哪里来的。还有一件事。你说你划了一百万行。我以为您预计的最大值为7000行140周x50个类别。我错过了什么?对不起,从3400万排开始。结果是49行数据。此外,连接的原因是类别名称存储在不同的表中。因此,我有一个索引号CATEGORY_number,我加入它,从第二个表DW.CATEGORY.CATEGORY中获得一个CATEGORY列。这就是连接的要点,我能让它更有效吗?另外,我刚刚运行了整个查询,花了35分钟完成。。。我猜你对索引的评论会是真的。这是怎么解决的?我该怎么说?