Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

Monday, February 15, 2010

Tips Generales para optimizar Query/SQL


Algunos tips que te ayudarán a que tus queries se ejecuten tan rápidos como sea posible


1- Crear  índices de acceso cuya clave posicionada más a la izquierda del query haga match con las condiciones de selección, ayuda al optimizador de búsqueda con la selección de valores.

2- Para realizar queries con join, crear indices que hacen “match” con las columnas del join ayuda al optimizador de búsqueda a determinar el promedio de filas que hacen “matching”

3- Especificar solo las columnas que necesitas para el query en la sentencia SELECT en lugar de especificar *. También podrías especificar FOR FETCH ONLY si las columnas no requieren ser actualizadas.

4- Utilizar el comando RGZPFM. Reorganize Physical File Membre para remover
Las filas eliminadas de las tablas. Utilizar el comando CHGPF REUSEDLT(*YES) para reusar las filas eliminadas.

5- Considera usar las siguientes opciones:
Especificar ALWCPYDTA(*OPTIMIZE) permite al optimizador del query crear copias temporales de data para obtener un mejor performance. The iSeries® Access ODBC driver y el  Query Management driver siempre usan esta modalidad. Si ALWCPYDTA(*YES) es especificado, el optimizador de búsqueda intentará implementar el query sin hacer copia de la data, pero creará una copia si así se requiere.  Si ALWCPYDTA(*NO) es especificado, copias de la data no serán permitidas. Si el optimizador del query no puede encontrar un modo de búsqueda que no requiera el uso de un almacenamiento temporal, entonces el query no puede ser ejecutado.
OPNQRYF FILE((STAFF)) FORMAT(FORMAT3)
   GRPFLD(JOB SALARY)
   KEYFLD(JOB SALARY)
   SRTSEQ(*LANGIDUNQ) LANGID(ENU)
   ALWCPYDTA(*OPTIMIZE)

6- Especificar DLYPRP(*YES) para retardar  la validación de la sentencia SQL hasta que una sentencia OPEN, EXECUTE, o DESCRIBE sea ejecutada. Esta opción mejora el tiempo de respuesta, eliminando validaciones redundantes.
C/Exec SQL
C+ Set Option Commit=*NONE, DatFmt=*ISO, DynUsrPrf=*Owner, DlyPrp=*YES
C/End-Exec

7- Para el SQL, usar CLOSQLCSR(*ENDJOB) o CLOSQLCSR(*ENDACTGRP) permite que las vías de acceso abiertas, permanezcan abiertas para futuras invocaciones. (CRTSQLXXX)

8- Usar  ALWBLK(*ALLREAD) permite al manejador bloquear el registro  de data para cursores de “solo lectura”.  SET OPTION ALWBLK = *ALLREAD 

Valores para ALWBLK:

*ALLREAD 

Las filas son bloquedas para “solo lectura” si el parámetro COMMIT es *NONE o *CHG. Todos los cursores en un programa que no son explícitamente utilizados para update serán abiertos para read-only aún cuando las sentencias EXECUTE o EXECUTE IMMEDIATE estén presentes en el programa.

Puede mejorar el performance de casi todos los cursores read-only en programas
Pero limita el query de las siguientes maneras:

El comando Rollback en el lenguaje anfitrión (ile RPG, RPG) ó la sentencia ROLLBACK HOLD SQL no reposiciona el cursor read-only.

La ejecución dinámica de una sentencia UPDATE o DELETE (por ejemplo usando EXECUTE IMMEDIATE) no pueden ser utilizada para actualizar una fila a menos que la sentencia DECLARE para la declaración del cursor incluya la cláusula FOR UPDATE.


*NONE 
Las filas no son bloqueadas para devolver la data a los cursores.
Garantiza que la data devuelta en la consulta está actualizada.
Puede reducir la cantidad de tiempo requerido para acceder la primera fila de la data.
Impide que el manejador de base de datos devuelva un bloque de data que no es utilizada por el programa cuando solamente las primeras filas del query son las requeridas.
Puede degradar el performance del query si la consulta devuelve un gran número de filas.


*READ 
Los registros son bloqueados para read-only cuando:

*NONE es especificado en el parámetro COMMIT, lo que indica que el commitment control no es utilizado

El cursor es declarado FOR READ ONLY o no hay una sentencia dinámica que pudiese ejecutar una sentencia UPDATE o DELETE posicionado por cursor.

Especificar *READ puede mejorar el performance total del query cuando una gran cantidad de registros cumplen con las condiciones de búsqueda.






Publicado por: Ing. Liliana Suárez.


Si te pareció interesante el artículo reenvíalo a un amigo, haciendo click en el sobrecito que está al final del artículo. El conocimiento es valioso, compártelo.

No comments: