'IN' 在 db2 sql 查询中如何工作?

How does 'IN' works in db2 sql query?

我的要求是 select 来自 DB2 的数据 table 其中 phone 数量等于 16 组 phone numbers.I 已尝试 运行 下面给出的这个查询对我的本地测试数据和我的程序成功运行! 但是,当我尝试 运行 在真实 table(backup table) 上运行相同的程序时,我的 运行 jcl 因 S722 异常终止而失败。

我觉得这不是 space 异常终止,因为我们使用的文件具有 7 个柱面(1 个主柱面,6 个副柱面)的属性。根据我的研究,我发现 sql 使用 'IN 进行查询,'LIKE' 需要花费太多时间来执行,因此将 Jobcard 中的时间参数更改为 NOLIMIT。但是运气不好!!

有人可以用其他任何方式帮助我编写此查询吗?或者帮我解决这个问题....

这样查询:

EXEC SQL
DECLARE WS-CURSOR CURSOR WITH HOLD FOR
SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB 
  WHERE PHONE_NUM IN ('123456789','789456123','456789123','789456123' etc) AND
        PHONE_TYPE = 'DU' 
END-EXEC.

提前致谢!!

这是一个内联 table 连接,而不是执行 where in 子句

IRL 我会将值放入临时 table 并加入临时 table。但是例如我已经在线完成了这个。

SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB

join (
values('123456789'),('789456123'),('456789123'),('789456123')
) as b (ph) on phone_num = ph

where PHONE_TYPE = DU 

两个 table 查询可能最快很难说,但对我来说,维护两个 table 肯定比每次运行时创建一个 SQL 语句的程序更容易.

SELECT CUST_ID,CUST_NAME,SEQ_NUM,PHONE_NUM FROM PHONE_TAB

join look_tab b on phone_num = b.ph

where PHONE_TYPE = DU 

Sx22 系列异常表示超出了某些系统定义的参数。例如,S322 通常表示您已经超过工作卡或工作步骤上 TIME 参数中的 CPU 时间。

S722 异常终止表示您产生的假脱机输出超过您商店的 JES 参数所允许的数量。您需要确定该假脱机输出的来源以解决异常终止。

您可能有一个核心转储 (CEEDUMP)、您编码的调试输出(SYSOUT 或 SYSPRINT 或 STDOUT 或 STDERR),或者您编码的失控报告 DD。 JESMSGLG DD 在 SDSF 输出顶部的假脱机中可见,或者通过使用“?”选择您的作业。可能会在 之前向 S722 报告错误。

也许您遇到的是 导致 S722 的 S322。完全有可能,因为数据量大的时候才会出现这个问题。

将时间参数设置为 NOLIMIT 是一种昂贵的调试技术,因为大多数大型机商店都有适当的退款算法,通常 CPU 时间 = 某人预算中的金钱。您的商店可能有一个 JES 出口,专门用一些其他值代替 NOLIMIT 以防止其使用。

如 user6542823 所述,您可以添加 JOBPARM LINES=some-large-number 来绕过 S722,但您仍然必须解决根本问题。

z/OS 尝试为您提供尽可能多的调试信息。好好利用它给你的东西。

鉴于...

  • 你说你的程序在本地测试数据下执行得很好
  • 当 运行 备份生产规模的数据时
  • 会出现问题

...那么如果...

  • 您本地测试数据中 table PHONE_TAB 的定义与备份和生产数据中的定义相匹配
  • 你的程序绑定成功
  • 您有权限读取备份数据

...问题可能与您的 SQL 无关,而是与数据量有关。

查看包的 EXPLAIN 输出,您可能会发现您正在扫描整个 PHONE_TAB table。可能在生产环境中有一个索引在您测试的备份中不存在。