簡體   English   中英

默認情況下內部表是如何排序的?

[英]How is the internal table sorted by default?

所以我想知道當我宣布

lt_table TYPE STANDARD TABLE OF mara.

是不是一樣

lt_table TYPE STANDARD TABLE OF mara WITH DEFAULT KEY.

還是在不聲明 DEFAULT KEY 時選擇了不同的標准表鍵?

正如ABAP 文檔中所解釋的那樣:

如果沒有為標准表定義顯式主鍵,它會自動具有標准鍵。

標准鍵是當您指示DEFAULT KEY (下面的第一個項目符號點)或什么都沒有(第二個項目符號點)時:

標准密鑰可以聲明如下:

  • 明確地,使用語句 TYPES、DATA 等的添加 UNIQUE|NON-UNIQUE KEY,其中指定添加 DEFAULT KEY 而不是組件列表。
  • 隱含地,如果在聲明帶有語句 DATA 的標准表中沒有明確指定主鍵。
  • 隱含地,如果在語句 DATA 中的 TYPE 后面指定了具有通用主表鍵的標准表類型。

編輯 2022 年 5 月 31 日:“標准表的鍵”的含義可能會有些混淆。 這可能會使人們認為表格已排序,然后訪問速度更快。

那是錯誤的。

只有當你明確地對你的內部表SORT itab BY comp1 comp2 (一次因為它很耗時)並使用READ TABLE itab WITH KEY comp1 = ... comp2 = ... BINARY SEARCH時,它才會更快。

聲明標准表的主鍵(默認鍵或顯式組件)是一種在SORTREAD TABLE等之后不提及組件的方法,但 ABAP 文檔建議在SORTREAD TABLE等之后顯式聲明它們。

因此,我認為聲明標准表的主鍵沒有任何興趣。

注意: COLLECT僅基於標准表的主鍵起作用,因此這里沒有選擇,除非您將COLLECT替換為如下代碼:

ASSIGN itab[ c1 = line-c1 c2 = line-c2 ] TO FIELD-SYMBOL(<exist_line>).
IF sy-subrc = 0.
  <exist_line>-counter = <exist_line>-counter + line-counter.
ELSE.
  INSERT line INTO TABLE itab.
ENDIF.

如果您想使用排序表來更快地訪問,更喜歡使用TYPE SORTED TABLETYPE HASHED TABLE (或任何具有輔助鍵的替代語法)聲明表,它確實會對表進行排序並且訪問速度更快,編譯器將發送與標准表相比,使用SORT (錯誤,因為已經排序)、 READ TABLE等更好的警告或錯誤消息(如果您使用 ATC,則只有一些警告)。

更多信息,請參閱ABAP 文檔 - itab - 表類別的選擇

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM