在带有 OR 的 WHERE 条件中使用的排序顺序



如果我有一个内部表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

相关内容

  • 没有找到相关文章

最新更新