由于运行在 DB2 AS400 7.3 数据库上的系统中存储的数据数量不断增加,我们决定在某些表上引入表分区。虽然创建分区表工作正常,但我们在分析查询的执行计划时遇到一些问题。让我们假设最简单的表包含大约 5000 万条记录,按列 YEAR 分区(范围 2020 - 2024)。每个分区包含 1000 万条记录。在表 QSYS2.SYSPARTITIONSTAT 中,我们可以看到分区已正确创建的确认(每个分区中的数据量也很好)。我们想通过运行最简单的查询来测试分区表的机制:
select * from dbschema.PARTITIONED_TABLE where YEAR = 2023.
因此我们只想从一个特定分区请求数据(通过分区键 YEAR)。
我们认为 DB2 会优化查询执行计划,并且该查询只会访问一个分区。相反,在系统和导航器(运行和解释)生成的执行计划中,我们可以看到,SQE 进行表扫描并分析表的所有成员(正在查询的表的成员 - *ALL)。
我们是否错过了什么,或者 DB2 AS400 根本没有这种机制,允许跳过在分区键不满足 where 子句中指定的条件的分区中的搜索? 是否有机会检查哪些分区到底用于查询执行?也许有一个系统表或一个命令可以观察到这一点。
我们的目标之一也是优化查询,因此我们认为表分区可以帮助我们,但我们现在不太确定。对我们有用的是为特定分区创建别名,然后在查询中使用别名。但这不是我们系统的解决方案。
感谢您的帮助。
文档的检查约束优化页面对我来说当然就好像您应该期望 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 参与其中。