Sunteți pe pagina 1din 35

PERFORMANCE

EN LA
PROGRAMACIN
ABAP/4

Versin 1.0
Diciembre 1998

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

TABLA DE CONTENIDOS
1.

REVISIN DEL DOCUMENTO...........................................................................................................4

2.

INTRODUCCIN...................................................................................................................................5

3.

INTERFAZ SQL......................................................................................................................................6
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11

4.

MANIPULACIN DE STRINGS........................................................................................................11
4.1
4.2
4.3
4.4
4.5
4.6

5.

OPERADORES ESPECIALES EN IF (CA,...)........................................................................................11


CONCATENACIN DE STRINGS........................................................................................................ 11
BORRANDO ESPACIOS EN BLANCO.................................................................................................. 12
CONCATENACIN DE STRINGS........................................................................................................ 12
PARTICIONES DE STRINGS.............................................................................................................. 13
LONGITUD DE STRINGS................................................................................................................. 13

TABLAS INTERNAS............................................................................................................................15
5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.11
5.12
5.13
5.14
5.15
5.16

6.

SELECT ... WHERE VS. SELECT + CHECK..........................................................................................6


SELECT SINGLE VS. SELECT-ENDSELECT.........................................................................................6
FUNCIONES AGREGADAS.................................................................................................................. 6
SELECT CON VISTAS........................................................................................................................ 7
SELECT CON SOPORTE DE BUFFER....................................................................................................7
ACTUALIZACIN DE COLUMNAS....................................................................................................... 8
SELECT CON SOPORTE DE NDICES...................................................................................................8
SELECT ... INTO TABLE T............................................................................................................... 8
SELECT-ENDSELECT VS. ARRAY-SELECT..........................................................................................9
SELECT WITH SELECT LIST.......................................................................................................... 9
ARRAR INSERT VS. SINGLE-ROW INSERT......................................................................................9

GENERANDO TABLAS ORDENADAS................................................................................................. 15


GENERANDO TABLAS SIN DUPLICADOS........................................................................................... 15
DIFERENTES FORMAS DE ACCESO CON CLAVE.................................................................................16
CLAVE DE ACCESO PARA MLTIPLE LNEAS.....................................................................................16
COPIANDO TABLAS INTERNAS........................................................................................................ 17
ORDENANDO TABLAS INTERNAS..................................................................................................... 17
LOOPS ANIDADOS......................................................................................................................... 18
BORRANDO UNA SECUENCIA DE LNEAS.........................................................................................19
GENERANDO TABLAS CONDENSADAS............................................................................................. 19
BSQUEDA LINEAL VS. BINARIA................................................................................................ 20
NDICES SECUNDARIOS.............................................................................................................. 21
USANDO UN REA EXPLCITA DE TRABAJO.................................................................................21
COMPARANDO TABLAS INTERNAS............................................................................................... 22
UNIENDO TABLAS INTERNAS...................................................................................................... 23
BORRANDO DUPLICADOS........................................................................................................... 23
BORRANDO UN CONJUNTO DE LNEAS........................................................................................24

TIPOS DE DATOS................................................................................................................................25
6.1
6.2
6.3
6.4
6.5

TIPOS DE DATOS DECLARADOS VS. PARMETROS SIN DECLARACIN DE TIPO..................................25


DECLARACIN DE TIPOS VS. SIN DECLARACIN DE TIPOS EN FIELD-SYMBOLS................................26
IF VS. CASE.................................................................................................................................. 26
CASE VS. PERFORM I OF ........................................................................................................... 27
WHILE VS. DO.............................................................................................................................. 27

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

7.

CONVERSIN DE CAMPOS.............................................................................................................28
7.1
7.2
7.3
7.4
7.5

8.

CAMPOS TIPOS I Y P..................................................................................................................... 28


CONSTANTES TIPO F...................................................................................................................... 28
MEZCLA DE TIPOS......................................................................................................................... 28
LITERALES TIPO C Y TIPO I......................................................................................................... 29
ARITMTICA................................................................................................................................. 29

UTILIZACIN DE TABLAS TRANSPARENTES, POOL Y CLUSTERS....................................31


8.1 TABLAS TRANSPARENTES Y POOL.................................................................................................. 31
8.2 TABLAS CLUSTER......................................................................................................................... 31
8.3 ATRIBUTOS DE LOS CAMPOS EN EL WHERE..................................................................................32

9.

GENERACIN DE NDICES SECUNDARIOS...............................................................................34

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

1. Revisin del Documento


Fecha
DD/MM/AA

Versin
#

Autor

Descripcin

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

2. Introduccin

Este documento es una compilacin de distintas sentencias y procedimientos


de programacin en ABAP/4 relacionados con performance. Estas
sentencias y procedimientos son comparados para determinar cuales tienen
mejor performance. Los tiempos medidos para la ejecucin no deben
tomarse como valores absolutos sino como valores indicatiovos de
comparacin de performance. No pueden tomarse como valores de ejecucin
para una instalacin determinada ya que fueron medidos en una server
especfico, con una carga de trabajo despreciable.

Adems de las consideraciones sobre sentencias y procedimientos ABAP/4


se desarrollan puntos a tener en cuenta relacionados con la base de datos de
SAP (vistas, ndices, etc.).

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

3. Interfaz SQL
3.1 Select ... Where vs. Select + Check
Select + Check
SELECT * FROM VERI_CLNT
CHECK: VERI_CLNT-ARG1 = 7.
ENDSELECT.
88,234 microsegundos

Select sin condicin


SELECT * FROM VERI_CLNT
WHERE ARG1 = 7.
ENDSELECT.
4,907 microsegundos

Siempre especifique sus condiciones en la clusula WHERE en vez de


realizar la evaluacin de la condicin con la instruccin check.
La base de datos entonces puede usar un ndice ( si existe alguno
adecuado ) siendo la performance de la red considerablemente mejor.

3.2 Select single vs. Select-Endselect


Select ... Endselect
SELECT * FROM VERI_CLNT
WHERE ARG1 = 7 AND
ARG2 = .
ENDSELECT.
4,549 microsegundos

Select single * ...


SELECT SINGLE * FROM VERI_CLNT
WHERE ARG1 = 7 AND ARG2 = .
4,160 microsegundos

Si necesita una sola fila de una tabla de base de datos o vista, use la
instruccin SELECT SINGLE en vez de un loop SELECT-ENDSELECT.
SELECT SINGLE requiere una comunicacin (I/O) con el sistema de la base
de datos, mientras que SELECT-ENDSELECT necesita dos.

3.3 Funciones agregadas


Select ... Where + Check
C4A = 000.
SELECT * FROM T100
WHERE SPRSL = 000.
CHECK: T100-MSGNR > C4A.
C4A = T100-MSGNR.
ENDSELECT.
221,213 microsegundos

Select using una funcin agregada


SELECT MAX(MSGNR) FROM T100 INTO
C4A
WHERE SPRSL = D AND
ARBGB = 00.
24,470 microsegundos

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

Si requiere encontrar el valor mximo, mnimo, sumatoria y promedio o la


cantidad de una columna de la base de datos; use las funciones agregadas
en vez de agregar instrucciones para realizar el clculo.

3.4 Select con Vistas


Instrucciones Select anidadas
SELECT * FROM DD01L
WHERE DOMNAME LIKE CHAR%
AND
AS4LOCAL = A.
SELECT SINGLE * FROM DD01T
WHERE
DOMNAME
= DD01LDOMNAME AND
AS4LOCAL
= A AND
AS4SERVERS = DD01L-AS4VERS
AND
DDLANGUAJE = SY-LANGU.
ENDSELECT.
1,472,996 microsegundos

Select con vistas


SELECT * FROM DD01V
WHERE DOMNAME LIKE CHAR
% AND
DDLANGUAJE = SYLANGU.
ENDSELECT.

308,670 microsegundos

Para procesar un join, use una vista en vez de instrucciones Select


anidadas.

3.5 Select con soporte de buffer


Select sin soporte de buffer
SELECT SINGLE * FROM T100
BYPASSING BUFFER
WHERE SPRSL
= D AND
ARBGB = 00 AND
MSGNR = 999.
4,395 microsegundos

Select con soporte de buffer


SELECT SINGLE * FROM T100
WHERE SPRSL
= D AND
ARBGB = 00 AND
MSGNR = 999.
242 microsegundos

Para tablas de solo lectura y uso frecuente, utilice SAP buffering.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

3.6 Actualizacin de columnas


Actualizacin de una lnea por vez

Actualizacin de las columnas

SELECT * FROM VERI_CLNT.


VERI_CLNT-FUNCTINT =
VERI_CLNT-FUNCTNT + 1.
UPDATE VERI_CLNT.
ENDSELECT.
545,008 microsegundos

UPDATE VERI_CLNT
SET FUNCTINT = FUNCTINT + 1.

70,487 microsegundos

Siempre que sea posible utilice la actualizacin por columnas, en vez de


actualizar una lnea de la tabla de la base de datos.

3.7 Select con soporte de ndices


Select sin soporte de ndices
SELECT * FROM T100
WHERE ARBGB = 00 AND
MSGNR = 999.
ENDSELECT.

3,749,142 microsegundos

Select con soporte de ndices


SELECT * FROM T002.
SELECT * FROM T100
WHERE SPRSL = T002-SPRAS
AND
ARBGB = 00
AND
MSGNR = 999.
ENDSELECT.
ENDSELECT.
121,096 microsegundos

Para todo uso frecuente de la instruccin Select, trate de utilizar un ndice.


Siempre se usa un ndice si se especifica una parte genrica de lo/s campos
del ndice, concatenndolos con AND lgicos en la clusula WHERE.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

3.8 Select ... Into Table t


Select + instruccin Append

Select into table

REFRESH X006.
SELECT * FROM T006 INTO TABLE
X006.
APPEND X006.
ENDSELECT.
2,246 microsegundos

SELECT * FROM T006 INTO TABLE


X006.

829 microsegundos

Es siempre ms rpido usar la instruccin Select into table que usar la


instruccin Append.

3.9 Select-Endselect vs. Array-Select.


Select into Table t ... Loop at t
SELECT * FROM T006 INTO TABLE X006.
LOOP AT TABLE X006.
ENDSELECT.
1,117 microsegundos

Select ... Endselect.


SELECT * FROM T006.
ENDSELECT.
2,022 microsegundos

Si procesa sus datos slo una vez , use un SELECT-ENDSELECT-LOOP en


vez de guardar los datos en una tabla interna con SELECT INTO TABLE. El
manejo de una tabla interna consume ms espacio.

3.10Select with select list


Select *

Select .with select list

SELECT * FROM DD01L WHERE


DOMNAME LIKE CHAR% AND
AS4LOCAL = A.
ENDSELECT.

SELECT DOMNAME FROM DD01L


INTO DD01L-DOMNAME WHERE
DOMNAME LIKE CHAR% AND
AS4LOCAL = A.
ENDSELECT.
89,276 microsegundos

240,062 microsegundos

Si slo le interesan determinadas columnas de la tabla,use una lista de


campos o una vista en vez de SELECT * .

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

3.11Arrar Insert vs. Single-row Insert


Insercin de una lnea por vez.
* Tabla TAB con 100 entradas
LOOP AT TAB.
INSERT INTO VERI_CLNT VALUES TAB.
ENDLOOP.
463,581 microsegundos

Insercin con arreglos


* Tabla TAB con 100 entradas
INSERT VERI_CLNT FROM TABLE TAB.
53,917 microsegundos

Siempre que sea posible, utilice operaciones con arreglos, en vez de


operaciones sobre una fila.
La frecuente comunicacin entre el programa de aplicacin y el sistema de
la base de datos produce un considerable overhead.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

4. Manipulacin de strings
4.1 Operadores especiales en IF (CA,...)
Do-Loop con Field-Symbols

Usando el operador CA

ASSIGN CHA(1) TO <C>.


DO 200 TIMES.
IF <C> = ( OR <C> = ).
Alguna operacin.
EXIT.
ENDIF.
ASSIGN <C>+1 TO <C>.
ENDDO.
1,123 microsegundos

IF CHA(200) CA ().
Alguna operacin.
ENDIF.

443 microsegundos

Utilice los operadores especiales CO, CA, CS en vez de adicionar


instrucciones de programacin.
Si se ejecutan instrucciones ABAP por cada caracter de un string, el
consumo de CPU puede incrementarse substancialmente.

4.2 Concatenacin de strings


Moviendo con offset
MOVE Jane TO CMA.
MOVE Miller TO CMB.
MOVE New York City TO CMC.
I1 = STRLEN(CMA). I2 = STRLEN(CMB).
MOVE Mrs. TO CHA.
MOVE CMA TO CHA+5. I1 = I1 + 6.
MOVE CMB TO CHA+I1. I1 = I1 + 12
+ 1.
MOVE from TO CHA+I1. I1 = I1 + 11
+ 5.
MOVE CMC TO CHA+I1.
Mrs. Jane Miller from New York City es
el valor
final de CHA.
93 microsegundos

Usando la instruccin CONCATENATE


MOVE Jane TO CMA.
MOVE Miller TO CMB.
MOVE New York City TO CMC.
CONCATENATE
Mrs. CMA CMB from INTO CHA
SEPARATE
BY SPACE.

Mrs. Jane Miller from New York City es


el valor
final de CHA.
28 microsegundos

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

Utilice la instruccin CONCATENATE en vez de adicionar instrucciones de


programacin.

4.3 Borrando espacios en blanco


Corriendo SY-FDPOS lugares

Usando SHIFT ... LEFT DELETING


LEADING

CLA contiene el string



Editor line n.

CLA contiene el string



Editor line n.

IF CLA CN SPACE. ENDIF.


SHIFT CLA BY SY-FDPOS PLACES LEFT
100 microsegundos

SHIFT CLA LEFT DELETING LEADING


SPACE.
8 microsegundos

Si quiere borrar los espacios en un string, utilice la instruccin SHIFT ...


LEFT DELETING LEADING ...
Otras instrucciones no tan rpidas:
CN y SHIFT ... BY SY-FDPOS PLACES, con CONDENSE si es posible.
CN y ASSIGN CLA+SY-FDPOS(LEN) ...
Evite usar SHIFT dentro de un loop WHILE.

4.4 Concatenacin de strings


Usando una funcin para concatenar

Usando la instruccin CONCATENATE

CALL FUNCTION
STRING_CONCATENATE_3
EXPORTING
STRING1 = T100-ARBGB
STRING2 = T100-MSGNR
STRING3 = T100-TEXT
IMPORTING
STRING = CLA
EXCEPTIONS
TOO_SMALL = 01.
194 microsegundos

CONCATENATE T100-ARBGB
T100-MSGNR
T100-TEXT INTO
CLA.

14 microsegundos

Algunas funciones para el manejo de strings tienden a ser obsoletas y


fueron reemplazadas por otras instrucciones o funciones en ABAP/4.
STRING_CONCATENATE
STRING_SPLIT

CONCATENATE

SPLIT

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

STRING_LENGTH
STRING_CENTERED
STRING_MOVE_RIGHT

STRLEN()

WRITE ... TO ... CENTERED

WRITE ... TO ... RIGHT-JUSTIFIED

4.5 Particiones de strings


Uso de SEARCH y MOVE con offset

Uso de la instruccin SPLIT

CMA contiene (410)-45174-6654312 y


ser dividido
en Cdigo de Area, Telfono1 y
Telfono2

CMA contiene (410)-45174-6654312 y


ser dividido
en Cdigo de Area, Telfono1 y
Telfono2

SEARCH CMA FOR -.


MOVE CMA(SY-FDPOS) TO AREA_CODE.
I1 = SY-FDPOS + 2.

SPLIT CMA AT - INTO AREA_CODE


TEL_NO1
TEL_NO2.

SEARCH CMA FOR - STARTING AT I1.


I1 = I1 - 1.
MOVE CMA+I1(SY-FDPOS) TO TEL_NO1.
I1 = I1 + SY-FDPOS + 1.
MOVE CMA+I1 TO TEL_NO2.
66 microsegundos

11 microsegundos

Utilice la instruccin SPLIT en vez de realizar una programacin para dividir


un string.

4.6 Longitud de strings


Obtener el CHECK_SUM con la longitud
del campo

Obtener el CHECK_SUM con strlen()

DATA: BEGIN OF STR,LINE TYPE X, END


OF STR,CHECK_SUM TYPE I.
MOVE KALEBVPQDSCFG TO CLA.

DATA: BEGIN OF STR,LINE TYPE X, END


OF STR,CHECK_SUM TYPE I.
MOVE KALEBVPQDSCFG TO CLA.

DO 64 TIMES VAYING STR FROM CLA


NEXT CLA+1.
CHECK STR NE SPACE.
ADD STR-LINE TO CHECK_SUM.
ENDDO.

I1 = STRLEN(CLA).
DO I1 TIME VARYING STR FROM CLA
NEXT
CLA+1.
CHECK STR NE SPACE.
ADD STR-LINE TO CHECK_SUM
ENDDO.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

597 microsegundos

171 microsegundos

Utilice la funcin STRLEN() para restringir la cantidad de ciclos que debe


efectuar la instruccin DO, cuando determina un CHECK_SUM.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

5. Tablas internas
5.1 Generando tablas ordenadas
Generacin en un paso usando
read/insert
TAB_DES contiene 1000 entradas
REFRESH TAB_DEST.
LOOP AT TAB_SRC.
READ TABLE TAB_DEST WITH KEY
K = TAB_SRC-K BINARY SEARCH.
INSERT TAB_SRC INTO TAB_DEST
INDEX
SY-TABIX.
ENDLOOP.
98,545 microsegundos

Generacin en dos pasos usando append


y luego sort
TAB_DES contiene 1000 entradas
REFRESH TAB_DEST.
LOOP AT TAB_SRC.
APPEND TAB_SRC TO TAB_DEST.
ENDLOOP.
SORT TAB_DEST BY K.
20,693 microsegundos

Si la cantidad de lneas es pequea, (menor a 20 entradas), o si se necesita


acceder a la tabla interna mientras sta es llenada; usar la opcin
READ/INSERT es la correcta.
Si la cantidad de datos es grande y la tabla se usar slo una vez que este
llena, es preferible el proceso en dos pasos.

5.2 Generando tablas sin duplicados


Generacin en un paso

Generacin en tres pasos

TAB_DES contiene 1000 entradas de las


cuales 500
son diferentes

TAB_DES contiene 1000 entradas de las


cuales 500
son diferentes

REFRESH TAB_DEST.
LOOP AT TAB_SRC.
READ TABLE TAB_DEST WITH KEY
K = TAB_SRC-K BINARY SEARCH.
IF SY-SUBRC <> 0.
INSERT TAB_SRC INTO TAB_DEST
INDEX
SY-TABIX.
ENDIF.

REFRESH TAB_DEST.
LOOP AT TAB_SRC.
APPEND TAB_SRC TO TAB_DEST.
ENDLOOP.
SORT TAB_DEST BY K.
DELETE ADJACENT DUPLICATES FROM
TAB_DEST COMPARING K.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

ENDLOOP.
43,469 microsegundos

26,259 microsegundos

Si la cantidad de lneas es pequea, (menor a 20 entradas), o si se necesita


acceder a la tabla interna mientras sta es llenada; usar la opcin
READ/INSERT es la correcta.
Si la cantidad de datos es grande y la tabla se usar slo una vez que este
llena, es preferible el proceso en tres pasos.

5.3 Diferentes formas de acceso con clave


Acceso va una clave default implcita

Acceso va una clave explcitamente


asignada

Tabla TAB contiene 30 entradas de


500 bytes cada.
La instruccin READ finaliza con SYSUBRC=4

Tabla TAB contiene 30 entradas de


500 bytes cada.
La instruccin READ finaliza con SYSUBRC=4

MOVE SPACE TO TAB.


TAB-K = 'X'.
READ TABLE TAB BINARY SEARCH.

READ TABLE TAB WITH KEY


K = 'X' BINARY SEARCH.

37 microsegundos

15 microsegundos

Si es posible, especifique el campo clave para realizar la lectura. De otra


manera el campo clave tiene que ser calculado dinmicamente por el
runtime system.

5.4 Clave de acceso para mltiple lneas


Clave de acceso con LOOP/CHECK

Clave de acceso con LOOP WHERE

Tabla TAB contiene 100 entradas de


500 bytes cada una, solo 5 coinciden
con la clave de bsqueda.

Tabla TAB contiene 100 entradas de


500 bytes cada una, solo 5 coinciden
con la clave de bsqueda.

LOOP AT TAB.
CHECK TAB-K = KVAL.
" ...
ENDLOOP.
1,395 microsegundos

LOOP AT TAB WHERE K = KVAL.


" ...
ENDLOOP.
387 microsegundos

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

LOOP WHERE es ms rpido que LOOP/CHECK porque LOOP WHERE


evala la condicin especfica internamente.
Como todas las expresines lgicas, la performance es mejor si los
operandos son del mismo tipo de datos. La performance puede ser
incrementada si el LOOP WHERE es combinado con FROM i1 and/or TO
i2, si es posible.

5.5 Copiando tablas internas


Forma rudimentaria para copiar una
tabla interna
Tabla TAB_SRC contiene 100
entradas de 100
Bytes cada.

Tabla TAB_SRC contiene 100 entradas


de 100 Bytes cada.
TAB_DEST[] = TAB_SRC[].

REFRESH TAB_DEST.
LOOP AT TAB_SRC INTO TAB_DEST.
APPEND TAB_DEST.
ENDLOOP.

949 microsegundos

314 microsegundos

Las tablas internas pueden ser copiadas por asignacin igual que cualquier
otro tipo de objetos de datos. Si la tabla interna itab tiene una lnea de
cabecera, la tabla puede accederse por itab[ ]

5.6 Ordenando tablas internas


SORT itab con una clave de
ordenamiento por default

SORT itab con una clave especfica

Tabla TAB contiene 100 entradas de


500 bytes cada una

Tabla TAB contiene 100 entradas de


500 bytes cada una
SORT TAB BY K.

SORT TAB.
2,026 microsegundos

821 microsegundos

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

La ejecucin sera ms rpida si se especifica la mayor cantidad posible de


claves de ordenamiento.

5.7 Loops Anidados


Loops anidados

Loop de cursor paralelo

Tabla TAB1 contiene 100 entradas de


100 bytes cada una
Tabla TAB2 contiene 10 * 100 = 1000
entradas de 100 bytes cada una

Tabla TAB1 contiene 100 entradas de


100 bytes cada una
Tabla TAB2 contiene 10 * 100 = 1000
entradas de 100 bytes cada una

LOOP AT TAB1.
LOOP AT TAB2 WHERE K = TAB1K.
" ...
ENDLOOP.
ENDLOOP.

I2 = 1.
LOOP AT TAB1.
LOOP AT TAB2 FROM I2.
IF TAB2-K <> TAB1-K.
I2 = SY-TABIX.
EXIT.
ENDIF.
" ...
ENDLOOP.
ENDLOOP.

394,175 microsegundos

10,029 microsegundos

Si TAB1 tiene n1 entradas y TAB2 tiene n2 entradas, el tiempo necesario


para el loop anidado con el algoritmo directo es O(n1 * n2), cuando el
cursor paralelo toma slo O(n1 + n2). El algoritmo de cursor paralelo
asume que TAB2 contiene slo las entradas que tambin contiene en TAB1.
Si esto no es cierto, el algoritmo de cursor paralelo se torna ligeramente
ms complicado, pero su caracterstica de performance es la misma.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

5.8 Borrando una secuencia de lneas


Rudimentaria forma para borrar una
secuencia de lneas

Ordenando al kernel a realizar el


trabajo

Tabla TAB_DEST contiene 1000


entradas 500 bytes cada una, las
lneas 450 a 550 sern borradas.

Tabla TAB_DEST contiene 1000


entradas 500 bytes cada una, las
lneas 450 a 550 sern borradas.

DO 101 TIMES.
DELETE TAB_DEST INDEX 450.
ENDDO.

DELETE TAB_DEST FROM 450 TO 550.

3,119 microsegundos

128 microsegundos

Con la nueva variante del delete


DELETE itab FROM TO
la tarea de borrar una secuencia de lneas puede ser transferidas al kernel.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

5.9 Generando tablas condensadas


COLLECT usando semntico READ
BINARY

Juntando va COLLECT

Tabla TAB_SRC contiene 10,000


entradas, 5,000
de las cuales tiene diferente claves

Tabla TAB_SRC contiene 10,000


entradas, 5,000
de las cuales tiene diferente claves

LOOP AT TAB_SRC.
READ TABLE TAB_DEST WITH KEY
K = TAB_SRC-K BINARY
SEARCH.
IF SY-SUBRC = 0.
ADD: TAB_SRC-VAL1 TO
TAB_DEST-VAL1,
TAB_SRC-VAL2 TO
TAB_DEST-VAL2
MODIFY TAB_DEST INDEX SYTABIX.
ELSE.
INSERT TAB_SRC INTO
TAB_DEST
INDEX SY-TABIX.
ENDIF.
ENDLOOP.

LOOP AT TAB_SRC.
COLLECT TAB_SRC INTO
TAB_DEST.
ENDLOOP.
SORT TAB_DEST BY K.

1,580,904 microsegundos

284,471 microsegundos

Si necesita la semntica del COLLECT , use COLLECT!


READ BINARY ejecuta en O(LOG2(n)) tiempo, y el ndice de la tabla interna
debe ser ajustado con cada INSERT. COLLECT, sin embargo, usa un
algoritmo hash y es independiente del nmero de entradas i.e. O(1) y no
necesita mantener una tabla de ndices. Si necesita al final los datos
ordenados, ordnelos despus de que los datos han sido coleccionados.
Si la cantidad de datos es pequea, el acercamiento READ/INSERT no es
malo, pero para cantidades mayores de datos (>1000), COLLECT es mucho
ms rpido.
CUIDADO: cuando carga una tabla interna, no utilice COLLECT en
combinacin con alguna instruccin de carga de tablas, por ejemplo
(APPEND, INSERT, and/or MODIFY). Si mezcla COLLECT con otra
instruccin, COLLECT no puede usar su algoritmo hash. En este caso

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

COLLECTS ejecuta una bsqueda lineal, la cual es dramaticamente lenta:


O(n).

5.10Bsqueda Lineal vs. Binaria


Bsqueda Lineal

Bsqueda Binaria

Tabla TAB contiene 1000 entradas de


100 bytes
cada. El READ finaliza con SYSUBRC=4

Tabla TAB contiene 1000 entradas de


100 bytes
cada. El READ finaliza con SYSUBRC=4

READ TABLE TAB WITH KEY K = 'X'.

READ TABLE TAB WITH KEY


K = 'X' BINARY SEARCH.

1,452 microsegundos

29 microsegundos

Si la tabla interna tiene muchas (>20) entradas, en una bsqueda lineal a


travs de todas las entradas el tiempo consumido es bastante alto. Trate de
mantener la tabla ordenada y usar bsqueda binaria.
Si TAB tiene n entradas, la bsqueda lineal se ejecuta en O(n) de tiempo,
mientras que la bsqueda binaria toma solamente O(log2(n)) de tiempo.

5.11ndices secundarios
Sin ndice secundario bsqueda
lineal
Tabla TAB contiene 1000 entradas.
El READ usa las 500 primeras
entradas.

Bsqueda binaria usando ndice


secundario
Tabla TAB contiene 1000 entradas.
El READ usa las 500 primeras
entradas.

READ TABLE TAB WITH KEY


DATE = SY-DATUM.
IF SY-SUBRC = 0.
...
ENDIF.

READ TABLE TAB_INDEX WITH KEY


DATE = SY-DATUM BINARY
SEARCH.
IF SY-SUBRC = 0.
READ TABLE TAB INDEX
TAB_INDEX-INDX.
...
ENDIF.

798 microsegundos

32 microsegundos

Si se necesita acceder a una tabla con diferentes claves repetidamente,


mantenga su propio ndice secundario.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

Con un ndice secundario, puede remplazar una bsqueda lineal con una
bsqueda binaria ms un acceso indexado .

5.12Usando un rea explcita de trabajo


Operaciones con tablas va la lnea de
cabecera

Operaciones con tablas va una


explcita rea de trabajo

El ancho de la lnea de la tabla TAB


es 500 bytes

El ancho de la lnea de la tabla TAB


es 500 bytes

TAB = TAB_WA.
APPEND TAB.

APPEND TAB_WA TO TAB.

17 microsegundos

9 microsegundos

Evite los MOVEs innecesarios, usando las operaciones explcitas de reas


de trabajo.
APPEND wa TO tab
INSERT wa INTO tab
COLLECT wa INTO tab
MODIFY tab FROM wa
READ tab INTO wa
LOOP AT tab INTO wa cuando es apropiado.

5.13Comparando tablas internas


Rudimentaria forma para comparar
tablas internas

Ordenando al kernel a realizar el


trabajo

Tablas TAB1 y TAB2 tienen cada 100


entradas de 100 Bytes cada

Tablas TAB1 y TAB2 tienen cada 100


entradas de 100 Bytes cada

DESCRIBE TABLE: TAB1 LINES L1,


TAB2 LINES L2.
IF L1 <> L2.
TAB_DIFFERENT = 'X'.
ELSE.
TAB_DIFFERENT = SPACE
LOOP AT TAB1.
READ TABLE TAB2 INDEX SYTABIX.
IF TAB1 <> TAB2.
TAB_DIFFERENT = 'X'.

IF TAB1[] = TAB2[].
" ...
ENDIF.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

EXIT.
ENDIF.
ENDLOOP.
ENDIF.
IF TAB_DIFFERENT = SPACE.
" ...
ENDIF.
1,774 microsegundos

535 microsegundos

Una tabla interna puede ser comparada en una expresin lgica igual que
otros objetos.
Dos tablas internas son iguales si tienen el mismo numero de lneas y cada
par de correspondiente lnea es igual.
Si una tabla interna itab tiene la lnea de cabecera, la tabla en si misma es
accedida por itab[].

5.14Uniendo tablas internas


Join natural: loop tab1, read tab2 con
clave

Cursor paralelo

Tabla TAB1 contiene 1000 entradas


de 100 bytes cada una.
Tabla TAB2 contiene 300 entradas de
100 bytes cada una.
Tabla TAB2 se asume ordenada por K
en orden ascendente

Tabla TAB1 contiene 1000 entradas


de 100 bytes cada una.
Tabla TAB2 contiene 300 entradas de
100 bytes cada una.
Tabla TAB2 se asume ordenada por K
en
orden ascendente

LOOP AT TAB1.
READ TABLE TAB2 WITH KEY
K = TAB1-K BINARY SEARCH.
IF SY-SUBRC = 0.
...
ENDIF.
ENDLOOP.

28,319 microsegundos

I2 = 1.
LOOP AT TAB1.
READ TABLE TAB2 INDEX I2.
IF SY-SUBRC <> 0. EXIT. ENDIF.
IF TAB2-K = TAB1-K.
" ...
ADD 1 TO I2.
ENDIF.
ENDLOOP.
9,824 microsegundos

Si TAB1 tiene n1 entradas y TAB2 tiene n2 entradas, el tiempo necesario


para juntar TAB1 y TAB2 con el algoritmo directo es O(n1 * log2(n2)),

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

mientras un acercamiento de cursor paralelo toma solamente O(n1 + n2)


de tiempo.
El mencionado algoritmo de cursor paralelo asume que TAB2 es un tabla
secundaria conteniendo solo entradas tambin contenidas en la tabla
primaria TAB1. Si esta asuncin no es verdadera, el algoritmo de cursor
paralelo es ligeramente ms complicado, pero su performance restante es
la misma.

5.15Borrando duplicados
Rudimentaria forma de borrar
duplicados

Ordenado al kernel a realizar el


trabajo

Tabla TAB_DEST contiene 1000


entradas de 100 bytes cada y
contiene 500 pares de duplicados

Tabla TAB_DEST contiene 1000


entradas de 100 bytes cada y
contiene 500 pares de duplicados

READ TABLE TAB_DEST INDEX 1 INTO


PREV_LINE.
LOOP AT TAB_DEST FROM 2.
IF TAB_DEST = PREV_LINE.
DELETE TAB_DEST.
ELSE.
PREV_LINE = TAB_DEST.
ENDIF.
ENDLOOP.

DELETE ADJACENT DUPLICATES FROM


TAB_DEST COMPARING K.

26,826 microsegundos

4,159 microsegundos

Con la nueva variante del DELETE , DELETE ADJACENT DUPLICATES, la tarea


del borrado es transferida al kernel.

5.16Borrando un conjunto de lneas


Rudimentaria forma de borrar un
conjunto de lneas

Ordenado al kernel a realizar el


trabajo

Tabla TAB_DEST contiene 1000


entradas de 500
bytes cada, estas coinciden el
WHERE condition

Tabla TAB_DEST contiene 1000


entradas de 500
bytes cada, estas coinciden el
WHERE condition

LOOP AT TAB_DEST WHERE K = KVAL.


DELETE TAB_DEST.

DELETE TAB_DEST WHERE K = KVAL.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

ENDLOOP.
14,491 microsegundos

6,496 microsegundos

Con la nueva variante del delete, DELETE itab [FROM ] [TO ] WHERE
, la tarea de borrar un conjunto de lneas puede ser transferido al kernel. Si
es posible, WHERE debera ser usado junto con FROM and/or TO para
mejorar la performance an ms.
La performance obtenida cuando se usa DELETE itab FROM, en vez de f
LOOP AT itab WHERE DELETE itab. ENDLOOP.mejora con el nmero de
entradas de la tabla interna y el nmero de lneas a ser borradas.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

6. Tipos de datos
6.1 Tipos de datos declarados vs. parmetros
sin declaracin de tipo.
Parmetros sin definicin de tipo

Parmetros con definicin de tipo

PERFORM UP1 USING IX M6-DIMID


M6-ZAEHL M6-ISOCODE M6ANDEC
M6-PRIMARY.

PERFORM UP2 USING IX M6-DIMID


M6-ZAEHL M6-ISOCODE M6ANDEC
M6-PRIMARY.

FORM UP1 USING

FORM UP2 USING


REPEAT TYPE I
DIMID LIKE T006-DIMID
ZAEHL LIKE T006-ZAEHL
ISOCODE LIKE T006-ISOCODE
ANDEC LIKE T006-ANDEC
PRIMARY LIKE T006-PRIMARY.

REPEAT
DIMID
ZAEHL
ISOCODE
ANDEC
PRIMARY.
Idntico cdigo fuente a la izquierda
y derecha:

Idntico cdigo fuente a la izquierda


y derecha:

DO REPEAT TIMES.
T006-DIMID = DIMID.
T006-ZAEHL = ZAEHL.
T006-ISOCODE = ISOCODE.
T006-ANDEC = ANDEC.
T006-PRIMARY = PRIMARY.
I1
= REPEAT - SY-INDEX.
ENDDO.
ENDFORM.

DO REPEAT TIMES.
T006-DIMID = DIMID.
T006-ZAEHL = ZAEHL.
T006-ISOCODE = ISOCODE.
T006-ANDEC = ANDEC.
T006-PRIMARY = PRIMARY.
I1
= REPEAT - SY-INDEX.
ENDDO.
ENDFORM.

228 microsegundos

161 microsegundos

Si especifica el tipo de dato a los parmetros en su cdigo fuente, el


compilador ABAP/4 puede optimizar el cdigo completamente. Adems el
riesgo de usar una secuencia errnea de parmetros en una instruccin
PERFORM es mucho menor.
Si tiene una extensa cantidad de programas con declaraciones sin tipo,
utilice la facilidad provista por el workbench para realizar una declaracin
de tipo automtica.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

6.2 Declaracin de tipos vs. sin declaracin de


tipos en Field-symbols
Field-symbols sin tipo

Ffield-symbols con declaracin de


tipo

FIELD-SYMBOLS: <F>.

FIELD-SYMBOLS: <I> type I.

ASSIGN I1 TO <F>.
I2 = <F>.
I3 = <F>.
I4 = <F>.

ASSIGN I1 TO <I>.
I2 = <I>.
I3 = <I>.
I4 = <I>.

11 microsegundos

7 microsegundos

Si se especifica el tipo de datos del Field-symbols y de los parmetros en


su cdigo fuente, el compilador ABAP/4 puede optimizar mejor el cdigo.

6.3 If vs. Case


If
IF
C1A =
ELSEIF C1A
ELSEIF C1A
ELSEIF C1A
ELSEIF C1A
ELSEIF C1A
ELSEIF C1A
ELSEIF C1A
ENDIF.

Case
'A'. WRITE '1'.
= 'B'. WRITE '2'.
= 'C'. WRITE '3'.
= 'D'. WRITE '4'.
= 'E'. WRITE '5'.
= 'F'. WRITE '6'.
= 'G'. WRITE '7'.
= 'H'. WRITE '8'.

16 microsegundos

CASE C1A.
WHEN 'A'. WRITE '1'.
WHEN 'B'. WRITE '2'.
WHEN 'C'. WRITE '3'.
WHEN 'D'. WRITE '4'.
WHEN 'E'. WRITE '5'.
WHEN 'F'. WRITE '6'.
WHEN 'G'. WRITE '7'.
WHEN 'H'. WRITE '8'.
ENDCASE.
7 microsegundos

La instruccin CASE es clara y un poco ms rpida que la construccin IF.

6.4 Case vs. Perform I of


Case

Perform I Of

* (I1 = 5 in this test)

* (I1 = 5 in this test)

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

CASE I1.
WHEN 1. PERFORM
WHEN 2. PERFORM
WHEN 3. PERFORM
WHEN 4. PERFORM
WHEN 5. PERFORM
WHEN 6. PERFORM
WHEN 7. PERFORM
WHEN 8. PERFORM
ENDCASE.

PERFORM I1 OF
PV1.
PV2.
PV3.
PV4.
PV5.
PV6.
PV7.
PV8.

11 microsegundos

PV1
PV2
PV3
PV4
PV5
PV6
PV7
PV8.
6 microsegundos

Una forma rpida de llamar a una determinada rutinas usando un ndice


dado, es usar la instruccin PERFORM I OF .

6.5 While vs. Do


Do

Case

I1 = 0.
DO.
IF C1A NE SPACE. EXIT. ENDIF.
ADD 1 TO I1.
IF I1 GT 10. C1A = 'X'. ENDIF.
ENDDO.

I1 = 0.
WHILE C1A = SPACE.
ADD 1 TO I1.
IF I1 GT 10. C1A = 'X'. ENDIF.
ENDWHILE.

8 microsegundos

6 microsegundos

Si puede use WHILE en vez de una construccin DO+EXIT. WHILE es ms


fcil para entender y rpido para ejecutar.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

7. Conversin de Campos
7.1 Campos tipos I y P
Tipo P

Tipo I

DATA: IP TYPE P.
DO 5 TIMES.
IP = SY-INDEX * 2.
READ TABLE X100 INDEX IP.
ENDDO.

DATA: IP TYPE I.
DO 5 TIMES.
IP = SY-INDEX * 2.
READ TABLE X100 INDEX IP.
ENDDO.

78 microsegundos

37 microsegundos

Es mejor usar campos de tipo I para variable que son tipicamente enteras
tales como ndices.

7.2 Constantes tipo F


Literal tipo C

Constantes tipo F

DATA:
FLOAT TYPE F.

CONSTANTS:
PI TYPE F VALUE
'3.1415926535897932'.

FLOAT = '3.1415926535897932'.
DATA:
FLOAT TYPE F.
FLOAT = PI.
22 microsegundo

1 microsegundo

Usar correctamente las constantes declaradas en vez de literales.

7.3 Mezcla de tipos


Varios tipos

Unicamente 1 tipo

DATA: F1 TYPE I VALUE 2,


F2 TYPE P DECIMALS 2 VALUE
'3.14',
F3 TYPE F.

DATA: F1 TYPE F VALUE 2,


F2 TYPE F
VALUE
'3.14',
F3 TYPE F.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

F3 = F1 * F2.
46 microsegundos

F3 = F1 * F2.
1 microsegundos

No mezcle tipos a menos que sea absolutamente necesario.

7.4 Literales tipo C y tipo I


Tipo C

Tipo I

SY-SUBRC = '0'.
CASE SY-SUBRC.
WHEN '1'.
WHEN '2'.
WHEN '3'.
WHEN '4'.
ENDCASE.

SY-SUBRC = 0.
CASE SY-SUBRC.
WHEN 1.
WHEN 2.
WHEN 3.
WHEN 4.
ENDCASE.

14 microsegundos

6 microsegundos

Utilice literales numricos o constantes con un tipo de nmero en vez de


un string de caracteres, si son tratados como enteros o campos tipo P.

7.5 Aritmtica
Tipo N

Tipo P

DATA:
N1(15) TYPE N VALUE
'123456789012345',
N2(15) TYPE N VALUE
'543210987654321',
N3(15) TYPE N.

DATA:
P1
TYPE P VALUE
'123456789012345',
P2
TYPE P VALUE
'543210987654321',
P3
TYPE P.

N3 = N1 + N2.

P3 = P1 + P2.

29 microsegundos

8 microsegundos

Utilice tipos numricos para operaciones aritmticas.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

8. UTILIZACIN DE TABLAS
TRANSPARENTES, POOL Y CLUSTERS
8.1 Tablas Transparentes y Pool
Cuando seleccione desde una tabla Transparente o Pool, siempre restrinja la
sentencia SELECT los ms posible con la opcin WHERE. Tambin con campos
de datos que pueden no ser parte de la clave. Esto permite a la Base de Datos
evaluar los registros y devolver solamente aquellos que concuerdan con el
criterio de seleccin.
Tablas transparentes y pool:
Select + Check

Select ... Where

SELECT * FROM ZZLT2


WHERE RLDNR = V_LDGR
AND
RRCTY = 0
AND
RVERS = 001
AND
RYEAR = V_YR.
CHECK V_CMPNY.
CHECK V_ACCT.
CHECK V_CNTR.

ENDSELECT.
Requiere ms memoria y buffer

SELECT * FROM ZZLT2


WHERE RLDNR = V_LDGR
AND
RRCTY = 0
AND
RVERS = 001
AND
RYEAR = V_YR
AND
BUKRS = V_CMPNY
AND
RACCT = V_ACCT
AND
RCNTR = V_CNTR.
.
ENDSELECT
Mas eficiente

8.2 Tablas Cluster


Cuando trabaje con tablas cluster hay que hacer exactamente lo contrario del punto
anterior. Solo utilice el comando SELECT, con los campos que son parte de la clave.
Si la tabla es una Tabla Cluster se usa el comando CHECK para eliminar registros
despus que la seleccin fue acotada usando la clusula WHERE con campos clave.
Las tablas clusters no pueden ser procesadas por la base de datos directamente, las
tablas transparentes si. En la mayora de los casos forzar a la base de datos a abrir y
chequear los campos (como cuando se usa SELECT y WHERE sobre campos no
clave) es menos eficiente que utilizar solo campos clave en el WHERE y permitir que
ABAP verifique los campos no clave despus que los datos son devueltos.

Tablas Cluster:
Para tablas Cluster BSEG con claves MANDT, BUKRS, BELNR, GJAHR, y BUZEI:

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

Select ... Where

Select + Check

SELECT * FROM BSEG


WHERE
BELNR = BSIK-BELNR
AND BUKRS = BSIK-BUKRS
AND LIFNR = BSIK-LIFNR
AND SHKZG = S
AND KOART = K.
..
ENDSELECT.

SELECT * FROM BSEG


WHERE
BUKRS = BSIKBUKRS
AND REBZG = BSIK-BELNR.
CHECK BSIK-LIFNR = BSEGLIFNR.
CHECK BSEG-SHKZG = S.
CHECK BSEG-KOART = K.
..
ENDSELECT.
Trabajar ms eficazmente con tablas
cluster, especialmente en ambientes
de muchos servidores de aplicacin.

Trabajar pero requiere mucha


memoria disponible, espacio de
Buffer y tiempo de base de datos
para desempaquetar y comparar
datos. Este trabajo puede ser muy
costoso. Puede cargar excesivamente
el servidor de base de datos

8.3 Atributos de los campos en el WHERE


Los campos que se comparan en el WHERE deben tener atributos similares. Si
no los tienen el sistema debe convertirlos cada vez que se realice la
comparacin. Cuando no se los pueda hacer similares a travz de la definicin
de los campos, se deben mover los datos a campos de trabajo antes de hacer
la comparacin.
Por ejemplo :
SELECT * FROM ZZLT2
WHERE RLDNR = LDGR
AND RRCTY = 0
AND RVERS = 001
AND RYEAR = YEAR.
SELECT * FROM ZZLS2
WHERE RLDNR = ZZLT2-RLDNR
AND RRCTY = ZZLT2-RRCTY
AND BUKRS = ZZLT2-BUKRS.
SELECT * FROM BSEG
WHERE BUKRS = ZZLS2-BUKRS
AND BELNR = ZZLS2-DOCNR

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

AND GJAHR = ZZLS2-RYEAR


AND BUZEI = ZZLS2-DOCLN.
==> Compara un
NUMC 3 con un CHAR 3. Dado que este SELECT se va a ejecutar muchas
veces, sera ms eficiente mover el campo de datos antes de comenzar el
loop del SELECT.
DATA: ZZ_TEMP_DOCLN LIKE BESG-BUZEI.
...
SELECT * FROM ZZLT2
WHERE RLDNR = LDGR
AND RRCTY = 0
AND RVERS = 001
AND RYEAR = YEAR.
SELECT * FROM ZZLS2
WHERE RLDNR = ZZLT2-RLDNR
AND RRCTY = ZZLT2-RRCTY
AND BUKRS = ZZLT2-BUKRS.
MOVE ZZLS2-DOCLN TO ZZ_TEMP_DOCLN.
SELECT * FROM BSEG
WHERE BUKRS = ZZLS2-BUKRS
AND BELNR = ZZLS2-DOCNR
AND GJAHR = ZZLS2-RYEAR
AND BUZEI = ZZ_TEMP_DOCLN.

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

9. Generacin de ndices secundarios


Toda tabla SAP tiene un ndice primario, que consiste de los campos claves
que el usuario defini en el proceso de creacin de la tabla. El ndice puede
no ser utilizado si no se tienen todas las claves en la causula WHERE del
SELECT o si la clusula WHERE no es correctamente especificada. En este
caso el administrador de la base de lee toda la tabla.
El diccionario de datos de SAP soporta un mximo de 16 ndices por cada
tabla.
Los ndices deberan, generalmente, tener menos de cinco campos.
Los campos ms selectivos de la tabla deberan estar primeros en el ndice
(por ejemplo el campo MANDT en casi todas las tablas).
En general si una condicin incluye el operador OR, el optimizador detiene
su procesamiento ( e invoca una bsqueda completa de la tabla ) tan
pronto como es encontrado el primer OR. La posible excepcin es un OR
que proponga una separada y nica condicin para la evaluacin.
Por Ejemplo :
La tabla ZTABLE se define con el siguiente ndice.
Nombre del campo Tipo Longitud
FIELDC
CHAR
3
FIELDF
CHAR
3
SELECT * FROM ZTABLE WHERE
FIELDC = ABC AND
( FIELDF = 12 OR FIELDF = 13)
No ser utilizado el ndice secundario

SELECT * FROM ZTABLE WHERE


( FIELDC = ABC AND FIELDF = 12 )
OR
( FIELDC = ABC AND FIELDF = 13)
El ndice ser utilizado como se esperaba

Las clusulas IN frecuentemente se interpretan igual que las OR y pueden


llevar al mismo problema del punto anterior.
La creacin de ndices adicionales bajar la performance en las funciones
de insercin de registros en la tabla. En general esto tiene un impacto alto
si existen muchos ndices sobre la misma tabla.
Un campo de un ndice es vlido solo si todos los campos que lo preceden
son utilizados en el WHERE del SELECT.
Por Ejemplo :
La tabla ZTABLE se define con el siguiente ndice.
Nombre del campo Tipo Longitud
FIELDA
CHAR
3
FIELDB
CHAR
3
FIELDC
CHAR
2

RENDIMIENTO EN LA PROGRAMACIN
ABAP/4

SELECT * FROM ZTABLE


WHERE FIELDA = 'ABC'
AND
FIELDB = 'XYZ'
AND
FIELDD = 'DEFG'.
No ser utilizado el ndice secundario

SELECT * FROM ZTABLE


WHERE FIELDA = 'ABC'
AND
FIELDB = 'XYZ'
AND
FIELDC = '12'.
El ndice ser utilizado como se esperaba

S-ar putea să vă placă și