连锁 vs 选择 RPG

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

我有一个链式操作,定义如下:

chain(e) (GetIacIsrKey.BaseKeyNumber:                     
          wNameKeyNumber:                                 
          GetIacIsrKey.SocietyCode) IACISR001R IacIsrData;

文件声明如下:

FIACISR001 IF E K 磁盘重命名(IACISR:IACISR001R) usropn

我知道它检索第一个找到的记录。如果我要将其转换为 SQL,考虑到我想获取通过链获取的相同记录,我将如何编写它?

SELECT * FROM IACISR WHERE 
  BASEKEY = <VALUE> AND 
  NAMEKEYNUMBER = <VALUE> AND 
  SOCIETYCODE = <VALUE> FETCH FIRST ONLY ..

我担心订购是否会改变 bw 链并选择?

总而言之,我的问题应该是链检索记录的默认顺序是什么。这是使用 SQL 创建的表,并定义了 PRIMARY KEY( BASEKEY , NAMEKEY , SOCCODE , LOCAFFNO ) )。

ibm-midrange rpg
2个回答
1
投票

我不是 SQL 专家,所以我不知道默认顺序是什么。但您可以添加“ORDER BY LOCAFFNO”以使其返回具有最早的 LOCAFFNO 值的记录。


0
投票

当您使用 CHAIN 时,您正在使用索引(逻辑文件),其中排序顺序由键字段的顺序确定。 当您使用 SQL 时,它会自行构建查询计划,并且记录的顺序可以是任何顺序(除非您显式指定 ORDER BY)。 另外,SQL可以是“静态的”(查询文本显式写在程序代码中,查询计划在编译阶段构建)

exec sql declare CUR cursor for select ...

或“动态”(查询文本在程序执行期间生成,查询计划在程序执行期间构建)。

query = 'select ...';
exec sql declare STMT statement;
exec sql prepare STMT from :query;
exec sql declare CUR cursor for STMT;

第二种情况在速度和效率方面并不是很好——构建查询计划可能需要大约 30% 的程序执行时间和大约相同数量的处理器资源。 根据多年的经验,我们得出的结论是,在需要处理一张表(一个逻辑文件)的情况下,使用操作码 - CHAIN / SETLL / SETGT / READ 更有利可图,并且在复杂查询的情况下需要在多个相关表上执行,并且样本大小可能很大,因此最好使用静态 SQL(我们仅在最极端的情况下使用动态 SQL,此时绝对不可能没有它)。 使用操作码执行某些操作会更快。例如,如果您需要检查表中是否存在至少一条具有给定关键字段值的记录,则完全没有必要从物理文件中读取该记录 - 您只需确保它是存在于逻辑中

setll (key value) logical file;
recExist = %equal(logical file);

此类检查需要最少的时间和处理器资源。

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