ABAP程序中内表会用到哈希表(hash)和排序表(sort):
排序表:关键字为 SORTED TABLE, 有一个逻辑索引,按其表关键字升序排序后再进行存储,其访问方式与标准表相同。
哈希表:关键字为 HASHED TABLE, 没有索引,只能通过关键字来访问。系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间和表的行数无关。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
REPORT ztest_hash_sort. TABLES:vbak, vbap. "
************************************************************************
** 定义结构类型 Define the structure's type **
************************************************************************
TYPES:BEGIN OF ty_result, vbeln TYPE sy-tabix, posnr TYPE vbap-posnr, kunnr TYPE vbak-kunnr, name1 TYPE kna1-name1, matnr TYPE vbap-matnr, arktx TYPE vbap-arktx, kwmeng TYPE vbap-kwmeng, meins TYPE vbap-meins, kbetr TYPE konv-kbetr, netwr TYPE vbap-netwr, waerk TYPE vbap-waerk, END OF ty_result.
************************************************************************
** 定义变量与内表 Define the variants and Internal tables **
************************************************************************
DATA:gt_hash TYPE HASHED TABLE OF ty_result WITH UNIQUE KEY vbeln posnr, gt_sort TYPE SORTED TABLE OF ty_result WITH UNIQUE KEY vbeln posnr, gs_result TYPE ty_result, gv_rows TYPE sy-tabix.
************************************************************************ ** 宏定义 Define the macro ** ************************************************************************
DEFINE mcr_range.
clear &1. &1-sign = 'I'. &1-option = &2. &1-low = &3. &1-high = &4. append &1.
END-OF-DEFINITION.
************************************************************************
** 选择屏幕 Customize the selection-screen **
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE text-001. PARAMETERS:p_rows TYPE sytabix DEFAULT '100', "初始化内表的记录数 p_loop TYPE sytabix DEFAULT '100'. "读取的次数 SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************ ** 执行程序事件 Executing the program's events ** ************************************************************************
INITIALIZATION.
START-OF-SELECTION.
PERFORM sub_init_data. PERFORM sub_sort_table. PERFORM sub_hash_table.
END-OF-SELECTION.
*@---------------------------------------------------------------------* *@ Form SUB_INIT_DATA *@---------------------------------------------------------------------* * 初始化选择条件 *----------------------------------------------------------------------*
FORM sub_init_data .
DEFINE mcr_init.
clear gs_result. gs_result-vbeln = sy-index. gs_result-kunnr = '100000000'. gs_result-matnr = 'A0010312'.
do 10 times. gs_result-posnr = gs_result-posnr + 10. insert gs_result into table gt_hash. insert gs_result into table gt_sort. enddo.
END-OF-DEFINITION.
REFRESH:gt_hash, gt_sort.
DO p_rows TIMES. mcr_init. ENDDO.
ENDFORM. " SUB_INIT_DATA
*&---------------------------------------------------------------------* *& Form SUB_HASH_TABLE *&---------------------------------------------------------------------* * 测试哈希表的性能 *----------------------------------------------------------------------*
FORM sub_hash_table .
CLEAR gv_rows.
DO p_loop TIMES. CLEAR gs_result. READ TABLE gt_hash INTO gs_result WITH KEY vbeln = sy-index posnr = '000020'. * TRANSPORTING NO FIELDS.
IF sy-subrc = 0. gv_rows = gv_rows + 1. ENDIF.
ENDDO.
WRITE:/ gv_rows.
ENDFORM. " SUB_HASH_TABLE
*&---------------------------------------------------------------------*
*& Form SUB_SORT_TABLE
*&---------------------------------------------------------------------*
* 测试排序表的性能
*----------------------------------------------------------------------*
FORM sub_sort_table .
CLEAR gv_rows.
DO p_loop TIMES. CLEAR gs_result. READ TABLE gt_sort INTO gs_result WITH KEY vbeln = sy-index posnr = '000020' BINARY SEARCH.
* TRANSPORTING NO FIELDS.
IF sy-subrc = 0. gv_rows = gv_rows + 1. ENDIF.
ENDDO.
WRITE:/ gv_rows.
ENDFORM. " SUB_SORT_TABLE |
经过SE30测试如下:
小数据量时:排序表则在小数据量的时候更迅速
哈希表在大数据的时候,有优势
以上。