【问题标题】:Db2 query is taking too much timeDb2 查询花费了太多时间
【发布时间】:2017-02-04 12:59:00
【问题描述】:

我的任务是从表中获取某些员工在特定年份的数据,但查询大约需要。 50 分钟获取 50 000 条 emp 记录。

表大约有。 60亿(6*10^9)数据

查询:

select a, b
from t1
where t1.year in (2012,2013) and
      t1.name in (select name from name_tab fetch first 50000 rows only)

Partitioned table: t1
partitioned col: t1.year

Index col: t1.name

我检查了访问计划,惊讶地发现分区和索引都没有被使用。

【问题讨论】:

  • 是否愿意发布计划(来自db2exfmt)以及实际的表和索引 DDL?

标签: sql indexing db2 partitioning


【解决方案1】:

首先,试试这个查询:

select a, b
from t1
where t1.year = 2012 and
      t1.name in (select name from name_tab fetch first 50000 rows only)

它是否识别分区?如果是这样,请尝试将查询编写为:

select a, b
from t1
where t1.year = 2012 and
      t1.name in (select name from name_tab fetch first 50000 rows only)
union all
select a, b
from t1
where t1.year = 2013 and
      t1.name in (select name from name_tab fetch first 50000 rows only)

您可能希望在子查询中放置一个order by,这样可以保证名称相同。

然后,在name_tab(name) 上放置一个索引。

【讨论】:

  • 我尝试过使用t1.year=2012,但仍然没有使用分区
  • @PuneetGupta 。 . .分区出了点问题。 year 可以存储为字符串。使用错误的类型可能会使优化器感到困惑。
  • 无法更改年份的数据类型,因为该表已有约 60 亿条记录
猜你喜欢
  • 2013-07-11
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多