哈希表(hash)和排序表(sort)性能比较

1, 名词解释

ABAP程序中内表会用到哈希表(hash)和排序表(sort):

排序表:关键字为 SORTED TABLE, 有一个逻辑索引,按其表关键字升序排序后再进行存储,其访问方式与标准表相同。

哈希表:关键字为 HASHED TABLE, 没有索引,只能通过关键字来访问。系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间和表的行数无关。

2, 例子代码

 

 

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测试如下:

小数据量时:排序表则在小数据量的时候更迅速

哈希表(hash)和排序表(sort)性能比较_第1张图片

哈希表在大数据的时候,有优势

哈希表(hash)和排序表(sort)性能比较_第2张图片

以上。

你可能感兴趣的:(性能)