如果我有一个内部表lt_itab
,类型为按werks matnr
排序,这个循环会进行二叉搜索吗?
LOOP AT lt_itab INTO ls_itab
WHERE ( werks = space OR werks = '*' ).
还是OR
强制进行线性扫描?
这是一个线性扫描
我构建了一个包含 1 亿行的小型测试程序。OR使循环速度慢约150倍。
它应该是线性扫描。
与FILTER
运算符一样,在我看来,只能在WHERE
中使用AND
连接多个比较,以确保它是二叉搜索。
对于哈希键,每个键组件只有一个比较表达式。op
唯一允许的关系运算符是=
,也是为了确保搜索是O(1)
的。
来自官方文档:
如果在 USING KEY 之后没有指定显式表键名称,则顺序 读取行的位置取决于表类别,如下所示:
标准表和排序表。行按升序读取 主表索引中的数字。在每次环路通过时,系统都 字段 sy-tabix 包含当前行的行号 主表索引。
哈希表。行按其处理顺序进行处理 插入到表中,并按语句后使用的排序顺序 排序。在每个循环传递中,系统字段 sy-tabix 包含值 0.
循环继续运行,直到所有满足 cond 的表行 条件已读取或直到它以语句退出。如果没有 找到适当的行,或者如果内部表为空,则循环 根本不运行。
循环不执行二进制搜索,因为它不是搜索,而是循环,即遍历lt_itab
中的每一行。
https://help.sap.com/http.svc/rc/abapdocu_751_index_htm/7.51/en-US/abaploop_at_itab.htm