Openedge:Open Query 中的 If..then 条件 - 性能问题

Lat*_*rma 1 progress-4gl openedge

open query q for each notepad no-lock where notepad.ctrl-code = pCode and (if pE-num = 0 then notepad.k-num = pk-num else notepad.e-num =  pe-num)
Run Code Online (Sandbox Code Playgroud)

我的问题是 - where 子句中的 if 条件会导致查询运行缓慢吗?

Mik*_*ner 7

简单的答案是肯定的 - 假设它是一张足够大的桌子。

您应该考虑编写一个动态查询:

IF pE-num = 0 THEN 
   QUERY q:QUERY-PREPARE ("for each notepad no-lock where notepad.ctrl-code = pCode and notepad.k-num = pk-num") .
ELSE 
   QUERY q:QUERY-PREPARE ("for each notepad no-lock where notepad.ctrl-code = pCode and notepad.e-num = pe-num") .

QUERY q:QUERY-OPEN() .
Run Code Online (Sandbox Code Playgroud)

动态查询消除了查询中的 IF 条件,并允许更好地利用可用索引。


Tom*_*com 5

大概。

正如所写,WHERE 子句将使用主索引进行 WHOLE-INDEX 搜索(“表扫描”)并对每条记录运行 IF 逻辑。

要查看该内容,请使用“COMPILE program.p XREF program.xrf”并在 XREF 输出中查找包含 SEARCH 的行。

慢不慢取决于你对慢的定义以及表中有多少条记录。