DB2 AS400 表分区 - 特定分区的执行计划

问题描述 投票:0回答:1

由于运行在 DB2 AS400 7.3 数据库上的系统中存储的数据数量不断增加,我们决定在某些表上引入表分区。虽然创建分区表工作正常,但我们在分析查询的执行计划时遇到一些问题。让我们假设最简单的表包含大约 5000 万条记录,按列 YEAR 分区(范围 2020 - 2024)。每个分区包含 1000 万条记录。在表 QSYS2.SYSPARTITIONSTAT 中,我们可以看到分区已正确创建的确认(每个分区中的数据量也很好)。我们想通过运行最简单的查询来测试分区表的机制:

select * from dbschema.PARTITIONED_TABLE where YEAR = 2023.

因此我们只想从一个特定分区请求数据(通过分区键 YEAR)。

我们认为 DB2 会优化查询执行计划,并且该查询只会访问一个分区。相反,在系统和导航器(运行和解释)生成的执行计划中,我们可以看到,SQE 进行表扫描并分析表的所有成员(正在查询的表的成员 - *ALL)。

Query execution plan

我们是否错过了什么,或者 DB2 AS400 根本没有这种机制,允许跳过在分区键不满足 where 子句中指定的条件的分区中的搜索? 是否有机会检查哪些分区到底用于查询执行?也许有一个系统表或一个命令可以观察到这一点。

我们的目标之一也是优化查询,因此我们认为表分区可以帮助我们,但我们现在不太确定。对我们有用的是为特定分区创建别名,然后在查询中使用别名。但这不是我们系统的解决方案。

感谢您的帮助。

sql database db2 query-optimization partitioning
1个回答
0
投票

文档的检查约束优化页面对我来说当然就好像您应该期望 Db2 仅查看

2023
分区一样。

在以下示例中,假设 PAYROLL 按范围分区(在 EMPNUM 上):

SELECT LASTNAME, SALARY
  FROM PRODLIB.PAYROLL 
  WHERE EMPNUM = :hv1

优化器向表中的每个分区添加新谓词:

SELECT LASTNAME, SALARY FROM 
  (SELECT LASTNAME, SALARY FROM  PRODLB.PAYROLL(PART00001)
   WHERE EMPNUM=:hv1 AND :hv1 <= 500
   UNION ALL
      SELECT LASTNAME, SALARY FROM  PRODLB.PAYROLL(PART00002)
   WHERE EMPNUM=:hv1 AND :hv1 >= 501 AND :hv1 <=1000 
  UNION ALL
  SELECT LASTNAME, SALARY FROM  PRODLB.PAYROLL(PART00003)
   WHERE EMPNUM=:hv1 AND (:hv1 IS NULL OR :hv1 >= 1001))
  X (LASTNAME, SALARY)  

如果hv1的值为603,则只有分区PART00002的行 正在接受检查。

我会检查以确保您当前处于操作系统的 PTF 上,特别是数据库组 PTF。

此外,您正在运行最新版本的 ACS。 可能只是“Explain”显示数据的方式存在错误。

您可能需要让 IBM 参与其中。

© www.soinside.com 2019 - 2024. All rights reserved.