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 条件会导致查询运行缓慢吗?
简单的答案是肯定的 - 假设它是一张足够大的桌子。
您应该考虑编写一个动态查询:
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 条件,并允许更好地利用可用索引。
大概。
正如所写,WHERE 子句将使用主索引进行 WHOLE-INDEX 搜索(“表扫描”)并对每条记录运行 IF 逻辑。
要查看该内容,请使用“COMPILE program.p XREF program.xrf”并在 XREF 输出中查找包含 SEARCH 的行。
慢不慢取决于你对慢的定义以及表中有多少条记录。