2012-12-12 17 views
2

*作为第一个注意事项,我只能读取我的服务器。只是,仅供参考,因为它似乎来了很多......组通过使查询天文学更长

服务器:DB2(6.1),其中i(IBM)

我有一个查询,我就在它有19mil行的表运行(我不设计它们,我只是查询它们)。我一直限制我的返回数据为10行(*),直到我得到这个查询整理出来,以便返回时间有点合理。

的基本设计是,我需要得到的数据有关的按周基础上,我们在一个星期卖的产品类别,使用列:WEEK_ID,和类别。这里的示例代码(有一些重要的位####出)。

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 2--Format is year/week 
GROUP BY WEEK_ID, CATEGORY 

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

这个问题有两个部分。第一个问题很简单:这是正常的吗?有50个类别(粗略)和140个星期(左右),我试图压缩。我意识到这是很多信息来冷凝19mil行,但我希望限制我的查询10行返回将最小化时间?

而且,如果我不只是一个完整的n00b,这其实不应该需要几分钟的时间,究竟是什么毛病我的SQL?

我谷歌搜索WHERE语句优化,似乎无法找到任何东西。所有的链接和解释都是值得欢迎的。

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

(*)使用SQLExplorer视窗,我的IDE,一个Eclipse实现松鼠的SQL。

+1

为什么'group by'?我看不到聚合..? –

+0

你是否真的在寻找'distinct',有任何机会? –

+0

好问题。对于每个日期/类别组合,都有几千个不同的条目(至少当你考虑表中的所有信息时)。但是对于我拉回来的数据,我并不关心那些不同的列,试图折叠行。我应该使用Select Distinct吗?既然我不拉回不同的行? –

回答

2

我不确定当查询中没有聚合函数时服务器如何处理group by。基于在评论你的答案,我只是尝试添加这些:

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

保留查询的其余部分是。

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

如果没有正确的索引,数据库服务器被迫做一个完整的表扫描,这可能说明你的性能问题。 3900万行的确需要花费一些不小的时间从磁盘读取。

同时检查WEEK_ID的数据类型为int或类似的,只是为了避免在查询中不必要的铸造。

要避免类别表上的表扫描,您需要确保Category_Number也是索引。 (它可能已经是,因为我认为它是该表的关键。)上WEEK_ID

+0

我添加了聚合,并能够在26秒内拉下大约1,000,000条记录。整个数据库有36亿条记录(不是前面引用的1.9Mil)。所以,从理论上讲,整个事情应该在15分钟内运行(我现在正在测试我的理论)。它看起来还是很慢......或者这是正常的吗? –

+0

我不会说“正常” ......你'where'条款限制了需要处理的数据量,但只有工作,如果WEEK_ID被索引 - 否则它仍然需要全表扫描。内部连接是否必需? (我只问,因为我不知道你从哪里得到SalesCost/SalesDollars列。) –

+0

还有一件事。你说你拉了一百万行。我以为你最多预计7000行(140周x 50类)。我错过了什么? –

0

指数,类别(以及可能CATEGORY_NUMBER)是使它非常快的唯一途径,所以你需要说服DBO介绍这些。