'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。可能在生产环境中有一个索引在您测试的备份中不存在。
我的要求是 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。可能在生产环境中有一个索引在您测试的备份中不存在。