LIKE 对于数据库来说是非常可怕的,因为你在一个循环中有这个,你很可能在每次循环迭代中扫描整个 E071。您应该尝试交换它并选择 E071 中的所有内容,然后在 SELECT...ENDSELECT 中检查您的表。我知道这听起来有悖常理,但它在我们构建的自定义 REGUH 索引上拯救了我。
SELECT * FROM e071 APPENDING TABLE gt_e071
WHERE obj_name LIKE gv_obj_name.
READ TABLE tadir WITH KEY.... ASSIGNING <fs_tadir>.
ENDSELECT.
作为替代选择,而不是使用单个 like 构建一系列值并将它们批量发送到选择。它仍然会表现不佳,但会更好。
data lt_obj_range type range of e071-obj_name.
data ls_obj_range like line of lt_obj_range.
LOOP AT tadir ASSIGNING <fs_tadir>.
ls_obj_range-sign = 'I'.
ls_obj_range-option = 'CP'.
CONCATENATE <fs_tadir>-obj_name '*' INTO ls_obj_range-low.
append ls_obj_range to lt_obj_range.
endloop.
SELECT * FROM e071 APPENDING TABLE gt_e071
WHERE obj_name it lt_obj_range.
请注意,数据库对 select 语句的大小有限制,因此如果您的范围内有太多项目,您将得到一个简短的转储,因此将其分解为大约 200-300 行的范围。