【发布时间】:2013-11-01 00:32:50
【问题描述】:
我有以下非常缓慢且低效的语句,我想选择 e071 中的所有条目,其中 obj_name 字段包含 tadir 中的 obj_name 字段的值,后跟通配符。
LOOP AT tadir ASSIGNING <fs_tadir>.
CONCATENATE <fs_tadir>-obj_name '%' INTO gv_obj_name.
SELECT * FROM e071 APPENDING TABLE gt_e071
WHERE obj_name LIKE gv_obj_name.
ENDLOOP.
由于不能将 LIKE 语句与“For all entries in”或连接一起使用,有什么方法可以提高效率?
【问题讨论】:
-
根据表 TADIR 和 E071 中有多少条目,从 E071 中选择所有条目,然后删除不需要的条目可能更有效。除非您确实需要所有字段,否则请尽量不要使用 select *。您可以使用事务 SAT 来衡量每个事务的性能。请记住,缓冲可能会影响任何后续运行,因此请确保您不要总是先运行一个测试,而是将它们混合起来以获得更好的结果。
-
有很多字段... Select * 是否比按名称选择字段更快(假设 RAM 不是限制因素),因为您不需要查找要返回的列?
-
是的,如果您需要大部分字段,SELECT * 可能会更快,并且更容易维护。您总是在减少数据库负载与减少网络负载和保持代码可维护性之间保持平衡。
-
您可以通过使用重复的通配符选择与 TADIR 建立一个包含您需要的所有对象名称的内部表。然后您可以使用此表对 E071 执行 FOR ALL ENTRIES 选择。这应该会更快,因为 TADIR 每个对象只有一次,而 E071 可以多次。
标签: performance abap opensql