需要在 DB2 中使用基于时间戳的 group by 优化慢查询

Posted

技术标签:

【中文标题】需要在 DB2 中使用基于时间戳的 group by 优化慢查询【英文标题】:Need to optimize slow query in DB2 using group by on timestamp 【发布时间】:2014-06-16 19:26:05 【问题描述】:

要求:按年和省创建的计费记录数。

数据库: DB2 9.5

以下是用于获取详细信息的查询,它需要大量时间,超过 1 小时并且超时。

每张表的记录数如下。 计费:900万 封面:100万 客户:300万 地址:400万。

select year(bill.created), addr.province,count(1) as yearprovicecount  from billing bill 
inner join cover cov  on ( bill.coveragecid = cov.coveragecid) 
inner join customer cust on (cust.customercid= cov.customercid)
inner join address addr on (cust.customercid=addr.customercid)
group by year(bill.created), addr.province;

Created 是一个时间戳列。

由于查询中没有where子句,查询变慢了。请让我知道是否有任何方法可以优化查询。

【问题讨论】:

仅仅通过查看查询,您就不必要地加入到客户表中,因为地址也有 customercid。尝试删除此联接,看看是否有任何明显的性能改进。 没有其他信息——DDL、解释计划等。你不会得到太多有用的帮助——只能猜测潜在的解决方案。 如果 billing 中也包含 customercid,那么您也可以删除连接以覆盖。我希望我们可以假设您对所有涉及的 id 字段都有索引。 缺少太多内容。我们需要更多信息来猜测,尽管在那里有customer 表似乎没有意义。我们无法从inner joins 告诉任何结果,因为我们对数据关系一无所知。例如,all billing 行总是与来自 'cover? If all tables always match all other tables, it _might_ help to reorder the inner joins` 的行匹配,但优化可能会自动完成。由于缺乏信息,我们无法确定。我们甚至不知道存在哪些索引。 @Ian Bjorhovde:当前版本的 DB 9.5 不支持解释计划,因此无法提供。 【参考方案1】:

谢谢大家,

我现在可以提取报告了,感谢您的建议。

1.我删除了不需要的连接

2。我添加了 where 子句来限制扫描的行数。

select year(bill.created), addr.province,count(1) as yearprovicecount  from billing bill 
inner join cover cov  on ( bill.coveragecid = cov.coveragecid) 
-- inner join customer cust on (cust.customercid= cov.customercid)
inner join address addr on (cust.customercid=addr.customercid)
where year(billhis.created) = 2014
group by year(bill.created), addr.province;

注意:DB 9.5当前版本不支持解释计划,因此无法提供。

【讨论】:

以上是关于需要在 DB2 中使用基于时间戳的 group by 优化慢查询的主要内容,如果未能解决你的问题,请参考以下文章

在 DB2 中获取没有时间戳的日期

如何从 DB2 中的两个时间戳中获取差异?

怎么使用group by?

我应该使用复合主键来加速 PostgreSQL 中基于时间戳的选择吗?

范围 COUNT 查询基于 Hibernate 中纪元时间戳的 DATE

DB2 RollupCubegrouping 的用法说明