【问题标题】:DB2 z/os running SQL query on a specific table partitionDB2 z/os 在特定表分区上运行 SQL 查询
【发布时间】:2019-02-06 17:53:30
【问题描述】:

我有一个包含客户交易的 db2 表。

这个表大约有 5 亿条记录,当我尝试在 BETWEEN 之间运行选择查询时 查询长时间运行的特定日期。 公司的一个 DBA 告诉我,如果我可以在我的 SQL 中指定分区,它会运行得更快。

所以问题是: 如果我有下表,其名称为 Cust_Trans 用以下列

Cust_Num, Trans_Date, Trans_Type, Trans_Value + 30 more columns

我可以对以下 SQL 查询进行哪些更改以使其针对特定分区?

Select *

From Cust_Trans

搜索论坛和 IBM 文档 我找到了涉及 SYSCAT 模式和 datapartitionnum 函数的解决方案

但是我的 DB2 版本没有 SYSCAT 模式 但只有 SYSIBM 模式。 所以我无法实施任何解决方案

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    您需要知道该表的分区列是什么,然后将一阶谓词(WHERE = ... 或 WHERE BETWEEN ... AND ...)添加到“主”分区列的查询中提供这样的过滤确实是您查询的意图。

    【讨论】:

      【解决方案2】:

      对于 Db2 for Z/OS,目录表位于 SYSIBM 模式中。

      对于 Db2 for Linux/Unix/Windows,目录视图采用 SYSCAT 模式。

      对于 Db2 for i 系列,目录可能在 QSYS2 模式中。

      对于 Db2 for Z/OS,查看 SYSIBM.SYSCOLUMNS 的表,其 PARTKEY_COLSEQ 非零的列是范围分区列。

      建议在查询的 WHERE 子句中使用分区列,假设至少有一个分区列是您提到的 trans_date 列。

      【讨论】:

      • 感谢您的回答。事实上,我找到了一个分区字段。但是,它不是我希望的日期字段,而是序列号,每个分区包含大约 150 万行。所以我创建了一个 R 脚本,循环遍历分区并检查每个分区中的日期是什么,然后第二个循环发送 SQL 以仅在找到所需日期的分区中检索数据。
      猜你喜欢
      • 2022-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多