Cómo mejorar la eficiencia del funcionamiento del programa ABAP
La eficiencia del programa es algo a lo que todo programador debe prestar atención, sin importar qué lenguaje utilice para el desarrollo. A veces, cuanto más corto es el programa, no es necesariamente más rápido.
A veces. Un programa tiene mucho código, pero no es necesariamente lento. El rendimiento es un arma de doble filo. Si bien se gana en eficiencia en el tiempo, se sacrifica espacio. A continuación se ofrecen algunas sugerencias para mejorar la velocidad de funcionamiento del programa y reducir la carga del sistema.
La primera es minimizar las operaciones de E/S, como leer y escribir en el disco duro, que consumen más tiempo, como leer y escribir en una base de datos. Los siguientes son
ejemplos de reducción de operaciones de E/S:
1. Reducir las operaciones de lectura y escritura de la base de datos DB Cuando se utiliza la vista VIEW, cuando la tabla está unida por la. la vista tiene actualizaciones de datos Al operar
, el sistema también se actualizará a esta vista al mismo tiempo, haciendo que los datos entre ellas sean los mismos, por lo que el uso de la vista traerá problemas de eficiencia a estas operaciones diarias
Si la mayoría de las tablas unidas por la vista son tablas de datos de transacciones que deben actualizarse en los asuntos diarios (como EKET), evite
usar vistas.
2. Evite usar SELECT * e intente usar declaraciones como SELECT A B C INTO TABLE ITAB. Esta operación leerá todos los datos que cumplan las condiciones en la tabla interna a la vez, lo cual es más rápido que en el bucle SELECT A B C INTO WA... APPEND... ENDSELECT
Agregar datos a la tabla interna es más rápido. No es necesario leer la base de datos con frecuencia.
3. Evite el uso frecuente de declaraciones SELECT SINGLE, especialmente cuando se usan en LOOP y SELECT...ENDSELECT. Se deben usar los datos a leer.
SELECCIONAR PARA TODAS LAS ENTRADAS EN las obtiene todas a la vez y luego usa LEER TABLA CON LLAVE... BÚSQUEDA BINARIA.
Aunque se dice que la memoria operativa es Es más eficiente que operar en el disco, si la memoria no está controlada, a veces es posible que deba operar el espacio de intercambio del disco duro
, lo que aumenta las operaciones de lectura y escritura de E/S en Como se menciona a continuación:
4, este problema también puede ocurrir cuando define una tabla interna. Por ejemplo, si define una tabla interna usando OCCURS 100 en lugar de OCCURS 0, causará la longitud. de la tabla interna sea mayor que 100. , ocupará el caché de la página del sistema.
5. Los grupos de campos son muy útiles para la clasificación y visualización en varios niveles. Escribe datos en el archivo de página del sistema en lugar de en la memoria (las tablas internas generalmente usan memoria). Por este motivo, los grupos de campos son más adecuados para procesar listas de grandes cantidades de datos (generalmente más de 50.000 registros). Si se trata de una gran cantidad de procesamiento de datos, primero debe consultar con el administrador del sistema para determinar la cantidad máxima de memoria que el programa puede usar para calcular cuántos recursos necesita usar. Luego puedes decidir si escribir los datos en la memoria o
intercambiar espacio.
6. Utilice SORT en lugar de ORDER BY. La cláusula ORDER BY se ejecuta en el servidor de la base de datos, mientras que SORT es una declaración ABAP que se ejecuta generalmente en el servidor de la base de datos. Se forma un problema de cuello de botella en el rendimiento, por lo que es mejor importar los datos a la tabla interna para SORT.
7. Evite usar la instrucción SELECT DISTINCT, porque cuando la use para determinar, el único campo es un. campo sin índice, la eficiencia es muy alta
Baja, así que importe la tabla interna ORDENAR y use DELETE ADJACENT DUPLICATES para repetirla.
El segundo es reducir la carga de la CPU , que se puede mejorar optimizando el programa, como declaraciones y algoritmos en el programa, los siguientes son ejemplos de optimización para reducir la carga de CPU
:
1. llamadas a funciones ABAP no tiene el término función en línea, por lo que si necesitamos Cuando las funciones se llaman con frecuencia, las llamadas a funciones tienen la sobrecarga de crear y liberar memoria de pila. En ABAP, los códigos de macro se pueden usar para mejorar la eficiencia de ejecución. no son funciones pero parecen Para las funciones, el compilador reemplaza las llamadas a funciones copiando códigos de macro, eliminando la necesidad de insertar parámetros en la pila, mejorando así la velocidad. Tenga en cuenta que el uso de macros
tiene desventajas: (1) Es propenso a errores. Las macros no se pueden pasar por valor. ¡Tenga mucho cuidado al usarlas para reemplazar funciones!
( 2) No depurable; (3) No se pueden operar miembros de datos privados de la clase.
2. Evite el uso de LOOPs y SELECTs usados en exceso... END SELECT Evite el uso de LOOPs y SELECTs anidados. .. END
SELECT.
3. Utilice el CAMPO CLAVE de la tabla tanto como sea posible como la opción condicional de la cláusula Where.
Por ejemplo, SELECCIONE * DE BSEG DONDE
BUKRS = '1000' AND BELNR = '0100000007' AND GJAHR =
'2006' AND BUZEI = '003' Los cuatro campos aquí. son BUKRS, BELNR, GJAHR y BUZEI son todos
campos CLAVE de la tabla BSEG.
4 Si es necesario extraer algunos datos con frecuencia de diferentes tablas, puede usar VIEW. para implementar el almacenamiento en caché de lectura Mejore la eficiencia Cuando la vista está conectada a una tabla que tiene muchas lecturas pero escrituras poco frecuentes (como la tabla de datos maestros de materiales MARA), puede usar la vista, que es mejor que en el programa. >
Es más rápido simplemente usar join. En teoría, la velocidad de cada lectura de la declaración de unión es la misma, mientras que la vista es más rápida a partir de la segunda lectura.
Y el caché reduce la velocidad. carga de red.
5. Cuando utilice JOIN en sentencias SQL, debe evitar tener más de 3 tablas JOIN, de lo contrario la eficiencia se verá seriamente afectada si realmente necesita
más. de 3 UNIR tablas, la forma correcta es no usar VER, sino usar SELECCIONAR... EN LA TABLA... PARA TODAS
ENTRADA EN y LEER TABLA CON BÚSQUEDA BINARIA CLAVE Por ejemplo, queremos. Para mejorar el rendimiento de la lectura de la tabla BSEG, primero
sacaremos algunos datos de la tabla BKPF a la tabla interna itab según la clave primaria GJAHR y luego los usaremos PARA TODAS LAS ENTRADAS EN itab DONDE
BSEG~BELNR = itab~BELNR así El método obtiene datos BSEG que cumplen todas las condiciones en itab. Tenga en cuenta que al usar FOR ALL
ENTRIES, primero debe verificar si las entradas internas. table itab ya que la condición está vacía y si la condición WHERE está en esta tabla interna. Hay un valor nulo
; de lo contrario, no es válido.
6. CAMPOS CORRESPONDIENTES DE y MOVE-CORRESPONDING, se realizará una comparación de campos, lo que causará problemas de CPU.
Alta sobrecarga.
7. Evite la conversión de tipos de datos excesiva y frecuente, como la conversión de N. a C, pero la conversión de N a STRING es muy rápida, porque la operación
STRING En comparación con el tipo CHAR, lleva menos tiempo comparar longitudes.
Utilice índices secundarios. para mejorar la eficiencia de lectura y escritura de DDIC. Puede crear un ÍNDICE en SE11 según sus necesidades y permitirlo en su programa
El orden de las condiciones WHERE en la declaración de consulta SQL es consistente con su orden de índice.
9. La búsqueda binaria es más eficiente que la búsqueda lineal. Utilice ORDENAR TABLA POR XXX ciertas palabras clave de la tabla antes de LEER TABLA y luego utilice LEER TABLA CON LLAVE XXX =. BÚSQUEDA BINARIA 'XXX'. Este es el llamado método de búsqueda binaria.
10. Evite el uso de sentencias SQL para condiciones de consulta dinámicas, nombres de tablas dinámicas y nombres de campos dinámicos. Utilice macros o módulos de subrutina en su lugar cuando sea necesario. .
11. Para funciones y métodos con la misma función, llamar a METHOD es más costoso que llamar a FUNCTION Fast.
12. Su complejidad temporal es O (log N), pero la inserción de nodos será lenta porque necesita moverse mucho y el nodo HASHED.
LE se basa en el algoritmo hash. Su eficiencia se refleja principalmente en una gran reducción del tiempo de almacenamiento y búsqueda de datos. Casi puede considerarse como un tiempo constante O (1), pero el costo es que consume más tiempo. A medida que la tecnología de hardware se desarrolla cada vez más en la actualidad, en cierto sentido vale la pena intercambiar espacio por tiempo. Pero cuando utilice una tabla hash, debe prestar atención a la unicidad del valor clave
. Si los valores clave se repetirán, no se puede usar la tabla hash, solo se pueden usar la tabla ordenada y la tabla estándar.
13. Es más eficiente utilizar ANEXAR LÍNEAS (o INSERTAR LÍNEAS) DE ITAB1 A ITAB2 que LOCALIZAR ITAB1 EN WA.
ANEXAR (INSERTAR) WA A ITAB2.
p>
14. Utilice las declaraciones COLLECT y DELETE ADJACENT DUPLICATE FROM más eficientes.
15. Utilice sentencias CONTEXT SQL eficientes. Por ejemplo, ¡el siguiente código 2 es más de 10 veces más rápido que el código 1!
Código 1:
SELECT. * DE SBOOK A SBOOK_WA HASTA 10 FILAS.
SELECCIONA UN SOLO AIRPFDE AIRPTO A (AP1, AP2)
DESDE SPFLI
DONDE CARRID = SBOOK_WA-CARRID
AND CONNID = SBOOK_WA-CONNID.
SELECCIONE UN ÚNICO NOMBRE EN NOMBRE1 DESDE SAIRPORT
DONDE ID = AP1.
SELECCIONE UN ÚNICO NOMBRE EN NOMBRE2 DE SAIRPORT
DONDE ID = AP2.
ENDSELECT.
Código 2:
SELECCIONAR * DE SBOOK A SBOOK_WA HASTA 10 FILAS.
SUMINISTRAR CARRID = SBOOK_WA-CARRID
CONNID = SBOOK_WA-CONNID
AL CONTEXTO TRAV1.
DEMANDA AIREPFROM = AP1
AIRPTO = AP2
NOMBRE_FROM = NOMBRE1
NOMBRE_TO = NOMBRE2
DESDE CONTEXTO TRAV1.
ENDSELECT.
Finalmente, preste atención al uso de la memoria. Los siguientes son ejemplos de optimización de la memoria:
1. Aunque ABAP tiene un mecanismo de eliminación de basura, esto se implementa una vez que se completa el programa. Por lo tanto, intentamos liberar variables, tablas internas y objetos inútiles;
2. Intente reducir las variables, tablas internas y objetos inútiles definidos estáticamente, porque los objetos definidos estáticamente serán
3. Intente reducir la carga de transmisión de la red. Por ejemplo, al diseñar los datos de la tabla interna devueltos por llamadas remotas RFC, los datos de la tabla interna deberían ser los mismos. ser lo más optimizado posible cuanto mayor sea la cantidad de datos, cuanto mayor sea el tamaño, más requisitos de CPU y memoria se requerirán;
4. n opción de la instrucción SQL.
SELECCIONE vbeln erdat
DE vbak
EN LA TABLA li_vbak TAMAÑO DEL PAQUETE 50.