-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathzqc_secondary_indexes.abap
167 lines (145 loc) · 4.89 KB
/
zqc_secondary_indexes.abap
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 ZQC_SECONDARY_INDEXES
*&
*&---------------------------------------------------------------------*
*& Compare a simple internal table sorted and accessed using BINARY
*& SEARCH with another one fully specified with two indexes.
*& The results show that the fully specified table can be over 5x faster
*&---------------------------------------------------------------------*
REPORT zqc_secondary_indexes.
PARAMETERS: p_recs TYPE i DEFAULT 100000,
p_bukrs TYPE bukrs DEFAULT '0231',
p_belnr TYPE belnr_d DEFAULT '8607407481',
p_gjahr TYPE gjahr DEFAULT '2009',
p_augbl TYPE augbl DEFAULT '8400057550'.
TYPES: ty_t_bseg1 TYPE TABLE OF bseg,
ty_t_bseg2 TYPE SORTED TABLE OF bseg
WITH UNIQUE KEY bukrs belnr gjahr buzei
WITH NON-UNIQUE SORTED KEY key_augbl COMPONENTS augbl.
DATA: t_bseg1 TYPE ty_t_bseg1,
t_bseg2 TYPE ty_t_bseg2,
t0 TYPE i ,
t1 TYPE i ,
t2 TYPE i ,
total1 TYPE i ,
total2 TYPE i .
* Header
WRITE: /20 'Binary search' RIGHT-JUSTIFIED, 40 'Fully specified' RIGHT-JUSTIFIED.
* Load sample data
PERFORM load_sample_data.
skip.
* Reset totals to compare SELECT and subsequent READS independently
CLEAR: total1 , total2.
* Read by parcial primary key
PERFORM read_table.
* Loop by clearing document ----------------------------
PERFORM loop_at.
SKIP.
WRITE: / 'Totals:', 20 total1, 40 total2.
*&---------------------------------------------------------------------*
*& Form write_cost
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_DESCRIPTION text
*----------------------------------------------------------------------*
FORM write_cost USING i_description.
DATA: delta1 TYPE i,
delta2 TYPE i .
delta1 = t1 - t0.
delta2 = t2 - t1.
ADD delta1 TO total1.
ADD delta2 TO total2.
WRITE: / i_description , 20 delta1 , 40 delta2 .
ENDFORM. "write_cost
*&---------------------------------------------------------------------*
*& Form load_sample_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM load_sample_data.
* Load sample data into
GET RUN TIME FIELD t0.
SELECT *
UP TO p_recs ROWS
FROM bseg
INTO TABLE t_bseg1.
GET RUN TIME FIELD t1.
SELECT *
UP TO p_recs ROWS
FROM bseg
INTO TABLE t_bseg2.
GET RUN TIME FIELD t2.
PERFORM write_cost USING 'Load data'.
ENDFORM. "load_sample_data
*&---------------------------------------------------------------------*
*& Form read_table
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM read_table.
* Read by primary key ----------------------------
* We must sort T_BSEG1
GET RUN TIME FIELD t0.
SORT t_bseg1 BY bukrs belnr gjahr buzei.
GET RUN TIME FIELD t1.
* No need to sort T_BSEG2
GET RUN TIME FIELD t2.
PERFORM write_cost USING 'Sort by key'.
DO 10 TIMES .
GET RUN TIME FIELD t0.
READ TABLE t_bseg1
TRANSPORTING NO FIELDS
WITH KEY bukrs = p_bukrs
belnr = p_belnr
gjahr = p_gjahr BINARY SEARCH.
GET RUN TIME FIELD t1.
READ TABLE t_bseg2
TRANSPORTING NO FIELDS
WITH KEY bukrs = p_bukrs
belnr = p_belnr
gjahr = p_gjahr .
GET RUN TIME FIELD t2.
PERFORM write_cost USING 'Read prim. key' .
ENDDO.
ENDFORM. "read_table
*&---------------------------------------------------------------------*
*& Form loop_at
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM loop_at.
data: count type i .
* We must sort T_BSEG1 again
GET RUN TIME FIELD t0.
SORT t_bseg1 BY augbl.
GET RUN TIME FIELD t1.
* No need to sort T_BSEG2
GET RUN TIME FIELD t2.
PERFORM write_cost USING 'Sort by AUGBL'.
DO 10 TIMES .
GET RUN TIME FIELD t0.
CLEAR count .
LOOP AT t_bseg1
TRANSPORTING NO FIELDS
WHERE augbl = p_augbl .
ADD 1 TO count.
IF count = 1000.
EXIT .
ENDIF .
ENDLOOP .
GET RUN TIME FIELD t1.
CLEAR count .
LOOP AT t_bseg2
USING KEY key_augbl " <--- explicitly saying which index to use
TRANSPORTING NO FIELDS
WHERE augbl = p_augbl .
ADD 1 TO count.
IF count = 1000.
EXIT .
ENDIF .
ENDLOOP .
GET RUN TIME FIELD t2.
PERFORM write_cost USING 'Loop by AUGBL' .
ENDDO.
ENDFORM. "loop_at