Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MEJORES PRACTICAS DE
PROGRAMACIÓN
INFORMIX
Febrero 2003
TABLA DE CONTENIDO
INTRODUCCION................................................................................................................................2
A. EN GENERAL............................................................................................................................3
1. Nombres estándares...............................................................................................................3
2. Ubicación física de los programas.........................................................................................5
3. Componentes Nuevos............................................................................................................7
4. Código Duro...........................................................................................................................7
B. PROGRAMAS 4GL.....................................................................................................................8
1. Datos Principales de Programas Modificados......................................................................8
2. Base de Datos.........................................................................................................................8
3. Variables del Programa.......................................................................................................10
4. Programas Batcheros...........................................................................................................10
5. Programas Interactivos........................................................................................................11
6. Arreglos................................................................................................................................11
7. Otros.....................................................................................................................................11
C. RECOMENDACIONES...........................................................................................................13
1. Recomendaciones en Base de Datos....................................................................................13
2. Tips.......................................................................................................................................13
3. Diseño de tablas...................................................................................................................18
4. Integridad y consistencia de la data....................................................................................21
5. Disponibilidad de la data.....................................................................................................22
6. Performance.........................................................................................................................23
7. Generalidades......................................................................................................................32
8. Funcionalidades del Informix...............................................................................................33
1
INTRODUCCION
2
MEJORES PRACTICAS DE PROGRAMACIÓN
INFORMIX
A. EN GENERAL
1. Nombres estándares.
GESTEL
Gpra* Averías Comercial
Gpgr* Gestión de Red Comercial
Gpga* Gestión de Abonados Comercial
Gpga600*/Gpld Gestión de Abonados Ldistancia
Gprc* Reclamos comerciales Comercial
Gpfa* Interfaces de facturación Comercial
Gpgc* Guía de Calles Comercial
Gptr* Ordenes de transferencia Comercial
Gpos* Ordenes de servicios Comercial
Gpmpr* Mantenimiento Preventivo Comercial
Gptu* Tups Comercial
Gpce* Comunicaciones de Empresas Comercial
Gpmc* Tiendas Multicentro Comercial
Gpma* Mantenimiento de Almacenes Comercial
Gprd* Gestión de Red Directa Comercial
Gpsi* Seguridad del Sistema Comercial
Gpis Integración Integración
Otros
Gk* Programas en librerías
Gm* Macros
*v Eventuales
CABLE
Gpfa* Facturación Administrac. y Finanzas
Gpfa* Cobranzas Administrac. y Finanzas
Gpca* Caja Administrac. y Finanzas
Gpat* Atención Comercial
Gpve* Ventas Comercial
Gpte* Teledifusión Soporte técnico
3
Sistema Módulo Area
CABLE
Gpfa* Facturación Administrac. y Finanzas
Gpfa* Cobranzas Administrac. y Finanzas
Gpca* Caja Administrac. y Finanzas
Gpat* Atención Comercial
Gpve* Ventas Comercial
Gpte* Teledifusión Soporte técnico
SICE
Spfa* Facturación Facturación
Spco* Cobranzas Facturación
Spav* Instalación y Averías
Spgc* Gestión Comercial
Spgi* Gestión Interna
GUIAS
Gpav* Avisos Comercial
Gpco* Consultas Comercial
Gpct* Contrato Comercial
Gpdi* Diagramación Producción
Gpes* Escaneo Comercial
Gpse* Seguridad Seguridad
Gpsv* Servicio al Cliente Comercial
Gpsg* Gestión Producción
Ejemplo :
4
2. Ubicación física de los programas.
Ruta Descripción
Directorios Estándares
GESTEL
/home/ges/gestel Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Gestel, que a su vez contiene todos
los componentes de este.
/home/ges/gesbatch Se encuentran los programas
eventuales.
/home/ges/gestel/geslib Se encuentran las librerías de Gestel
/home/ges/gestel/libce Se encuentran las librerías de Gestel
de Comunicación de Empresas
/home/ges/gestel/libmat Se encuentran las librerías de Gestel
de Materiales
/home/ges/gestel/libcob01 Se encuentran todos las librerías de
Gestel Cobranzas
/home/ges/gestel/gesmac Se encuentran las macros
/home/ges/gestel/libcuc Se encuentra todas las librerías del
Cuc.
/home/ges/gestel/stores Se encuentran los scripts de los
stored procedures.
Ruta Descripción
Directorios Estándares
CABLE
/home/cm/cmtel/gescab Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Cable, que a su vez contiene todos
los componentes de este.
/home/cm/cmtel/gescab/gesbatch Se encuentran los programas
eventuales.
/home/cm/cmtel/gescab/stores Se encuentran los scripts de los
stores procedures
/home/cm/cmtel/gescab/triggers Se encuentran los scripts de los
triggers
/home/cm/cmtel/gescab /gesmac Se encuentran las macros
5
Ruta Descripción
Directorios Estándares
SICE
/home/ce/sice Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Sice, que a su vez contiene todos los
componentes de éste.
/home/ce/sice/sicbatch Se encuentran todos los batcheros
eventuales.
/home/ce/sice/stores Se encuentran los scripts de los
stores procedures
/home/ce/sice/triggers Se encuentran los scripts de los
triggers
/home/ce/sice/sicmac Se encuentran las macros
Ruta Descripción
Directorios Estándares
GUIAS
/home/guitel/4gl Dentro de este folder se encuentra
una carpeta por cada ejecutable de
Guías, que a su vez contiene todos
los componentes de éste.
/home/guitel/guibatch Se encuentran los programas
eventuales.
/home/guitel/stores Se encuentran los scripts de los
stores procedures
/home/guitel/triggers Se encuentran los scripts de los
triggers.
/home/guitel/guimac Se encuentran las macros
/home/guitel/esqlc Dentro de este folder se encuentra
una carpeta por cada ejecutable en
lenguaje C de Guías, que a su vez
contiene todos los componentes de
éste.
6
3. Componentes Nuevos
Ejemplo :
#*************************************************************
# PROGRAMA : gptu067.4gl
# DESCRIPCION : GENERA REPORTE CON INFORMACION DE ALTAS
# DE INSTALAR POR ZONALES.
# PARAMETROS : <USUARIO> <TIPO> [FECHA DE PROCESO] [ZONAL]
# Donde <TIPO> = '1':Batch '2':Linea
# AUTOR : LUIS FLORES FERNANDEZ - LAFF
# LIBRERIAS : RUTINAS.A
# FECHA : 08-11-2002
4. Código Duro
7
B. PROGRAMAS 4gl
Ejemplo :
#---------------------------------------------------------------------
# Modificaciones:
# 13-05-2002 RSLA Incidencia en la consulta de Carta Fianza
m 05.09.2002 CTE Cambiar fecha de ejecucion por fecha de puesta
# en servicio para TUPS en opcion de consulta
# 18.12.2002 EOB Se activa Consulta de Susp./Recon. LD en Submenu
# de Larga Distancia
#---------------------------------------------------------------------
2. Base de Datos
Ejemplo :
Ejemplo:
select * from gt01_movped
8
debe haber interacción con el usuario con sentencias como
PROMPT, SLEEP, SELECT, INPUT, CONSTRUCT.
Ejemplo :
9
' where (cciudad = ? ',
' and nsolic = ? ',
' and codser = ? ',
' and codmov = ? ',
' and idocv = ?)'
prepare upd081 from wsql
Ejemplo :
Ejemplo :
close cur_insterc
free cur_insterc
4. Programas Batcheros
Ejemplo :
10
En el mensaje de errores incluirse en el texto "-F- ", siempre
y cuando consideren que el error es fatal o que se deba
detener la ejecución de los subsiguientes procesos.
Ejemplo :
display "-F- ErrorPSCB1"
5. Programas Interactivos
6. Arreglos
7. Otros
Ejemplo :
let wltecmov = pro_busca_usutec()
Ejemplo :
.SUFFIXES: .o .ec .4gl .4go .4ga .4gi .per .frm .msg .iem
LIB_FILE=/home/ges/gestel/geslib/rutinas.a
4GL = gpga602b.4gl
# FORM = gpga602b.per
NAME_PROG = gpga602b.4ge
COBJS=$(4GL:.4gl=.o)
POBJS=$(4GL:.4gl=.4go)
11
CFORM=$(FORM:.per=.frm)
RDS_NAME=$(NAME_PROG:.4ge=.4gi)
12
C. RECOMENDACIONES
2. Tips
13
Idem B. pero la distribución se hace ordenadamente para todas las
filas de la(s) tabla(s). Esta opción debe ser utilizada exclusivamente
por los Adm. De B.D. su tiempo de ejecución es lento.
2.- Todo cambio sobre la Base de Datos (campo, tabla, índice, etc)
deben ser notificados a una persona encargada de la B.D. por parte de
Gestel (Edgardo Osorio), el cual a su vez notificará al resto del
personal Gestel, es recomendable la utilización de una hoja control,
para las modificaciones y observaciones.
14
Todas estas operaciones toman tiempo. Cuando se corren
instrucciones SQL repetidamente, aún cuando no cambie entre cada
corrida, el manejador hace todas las tareas anteriores lo cual es
innecesario. Utilizando la instrucción PREPARE se puede mejorar el
uso repetitivo de esas operaciones.
15
En este ejemplo se puede apreciar que existen dos ciclos repetitivos
(el primero incluye al segundo) esto quiere decir que la instrucción
DECLARE que se encuentra dentro del primer ciclo repetitivo, se
realizará el mismo número de veces que ese ciclo repetitivo.
La utilización de las instrucciones PREPARE en las instrucciones SQL
hacen que la parte del SQL que no varía, este prácticamente pre-
compilada y validada para el manejador, lo que significa una mejora
del performance en la ejecución de la instrucción SQL.
Para cada insert que se realiza en el segundo ciclo el manejador
también tendrá que validar la instrucción SQL, lo que significa gran
perdida de tiempo, es necesario utilizar la instrucción PREPARE
Este fragmento de codigo se pudiera mejorar de la siguiente manera:
:
DECLARE SEL_CUR1 CURSOR FOR # como se utiliza una sola
vez no hay problema
SELECT * FROM GT201_DEUDAS
LET VAR_STMT=“SELECT * FROM GT201_RUBROS “,
“WHERE DR_CODCEN = ? AND “,
“DR_SERV = ? AND “,
“DR_NUMDOC = ? AND “,
“DR_FCHEMI =?“
PREPARE SEL_CUR2_STMT FROM VAR_STMT
DECLARE SEL_CUR2 CURSOR FOR SEL_CUR2_STMT
LET VAR_STMT2= “INSERT INTO GESTEL:GT201_RUBROS
VALUES ”, “(?, ?, ?, ?, ?, ?)”
PREPARE INS_CUR1 FROM VAR_STMT2
FOREACH SEL_CUR1 INTO NEW201.*
OPEN SEL_CUR2 USING NEW201.CCIUDAD,
NEW201.CSERFAC,
NEW201.NFACCOB,
NEW201.FEMIFAC
FOREACH SEL_CUR2 INTO T201R.*
EXECUTE INS_CUR1 USING T201R.DR_CODCEN,
NEW201.NINSCR,
T201R.DR_SERV,
T201R.DR_NUMDOC,
T201R.DR_CODRUB,
T201R.DR_MTORUB
IF SQLCA.SQLCODE = -268 ...
:
:
END FOREACH
CLOSE SEL_CUR2
:
:
END FOREACH
16
También es necesario que cuando se utilicen los cursores y se hagan
SELECT * FROM ... seleccionar solamente los campos necesarios, no
todos (*), para mejorar el uso de los recursos.
A)Deshabilitación individual:
set constraints r100_001, r300_451 disabled;
set indexes idx_solic disabled;
set triggers ins_solic disabled;
17
3. Diseño de tablas
18
Es importante ponerse de minimizado a un solo índice
acuerdo al momento del como ix1(b, c, d, a) y
diseño de los índices para trabajar los querys con él.
evitar que durante la
programación se redunde en
los índices.
Evitar uso de índices con
campos de tipo char cuya
longitud sea grande, o con
columnas donde los valores
sean entre 2, 3 ... etc. Es
importante considerar el
volumen de información de la
tabla.
Tamaños de los A mayor número de columnas El tamaño de los índices se
índices en una llave, mayor es el ve incrementado cuando
tamaño del índice, por lo que interviene columnas de tipo
se requerirá mayor espacio. char cuya longitud sea
La estructura de índice en amplia.
Informix es un Arbor B-Tree+.
Al espacio ocupado a la llave
se le debe agregar 5 bytes o 9
bytes en caso que la tabla sea
fragmentada.
Indices unique Al momento de ejecutar una
búsqueda, al encontrar la
primera igualdad por los
componentes del índice
unique, el motor no continua
buscando otras coincidencias,
cosa que sucede con los
índice de tipo duplicado.
Llaves primarias Las llaves primarias crean un
índice de tipo UNIQUE,
refuerza la integridad de la
información. Por definición de
integridad las llaves primarias
no aceptan nulos.
Llaves foráneas Refuerza la integridad de la A muchas llaves foráneas
información. Se apoya de en una tabla, genera
índices (tipo duplicado) en las demasiados índices.
tablas
Constraints Check Refuerza la integridad de la
información haciendo que
valores validos sean
almacenados en la tabla. El
código de validación ya no
esta en la aplicación sino en
la base de datos.
19
Valores por “default” Refuerza la integridad de la
información haciendo que
sean almacenados valores
por defecto y no valores
NULOS. El control lo tiene la
Base de datos y no la
aplicación.
Funcionalidad “Alter in Funcionalidad del motor a Cuando la columna es
place” partir de la versión 7.2X y agregado al principio o al
posteriores. Consiste en medio de la tabla, el motor
columnas que sean reconstruye por completo la
agregadas al final de la fila, tabla, generando los
sólo se modifique el temporales y log necesarios
diccionario de datos y la para dicha operación de
estructura continué con la “alter table”. A mayor
estructura anterior. Conforme volumen de información de
se vayan haciendo las la tabla, el tiempo, los logs,
actualizaciones (sentencias los locks, el espacio son
UPDATE’s o INSERT’s), estas factores críticos en esta
filas con la antigua versión operación.
(estructura anterior) se
cambia a la nueva estructura
de la tabla.
Extents Cuando se crea una tabla, el Una de las base de
motor le asigna una cantidad optimización es tener el
consecutiva de paginas (por menor número de extent
defecto 8 páginas), al cual se (menor a 8), es importante
le conoce como EXTENT, si contar con el crecimiento
no se estimo el crecimiento de estimado de la tabla, al
tablas los extent van momento de crear la tabla
incrementando, como se le índica un primer
consecuencia la información extent amplio que pueda
se dispersa en el disco, contener datos por un
haciendo mas dificultoso las periodo de tiempo largo.
operaciones de I/O.
Tipo bloqueo de tablas Al momento de crear un tabla, En el bloqueo de tipo
se puede especificar el modo PAGE, todas las filas que
de bloque en él. Por defecto se encuentren en esa
es de tipo page. El modo de página permanecen
bloqueo puede ser cambiado bloqueadas hasta que la
luego que se creé la tabla. operación de actualización
termine (commit o rollback).
Fragmentación de Funcionalidad del motor que Las operaciones de I/O se
tablas permite colocar en distintos concentra en un solo
fragmentos los datos de una dbspaces. El uso permite
tabla. Cada fragmento es explotar los beneficios de
colocado en distintos multithread, paralelismo y
dbspaces de acuerdo a una balanceo de I/O.
condición o en forma
aleatoria.
20
4. Integridad y consistencia de la data
21
5. Disponibilidad de la data
22
6. Performance
23
rowid. y sustituir por el acceso a
través de la clave primaria.
Transacciones cortas Menor contención de recursos Al mantener registros
bloqueados durante mucho
tiempo hace que otros
usuarios esperen por él,
incrementando los tiempos
de respuesta para otros
usuarios.
Preparación de Mejora considerablemente el En cada iteración de una
instrucciones sql performance de los instrucción sql dentro de un
programas que hacen ciclo se realiza la validación
procesamiento de datos en de la instrucción, chequea
ciclos repetitivos, la validación la sintaxis, si el usuario
y optimización de la tiene los permisos para
instrucción se realiza una vez utilizar las tablas y
en la preparación y no cada columnas mencionadas y
vez durante la ejecución. analiza la instrucción para
ejecutarla eficientemente,
trabajo que implica tiempo y
recursos.
Seleccionar las El manejador tiene la Los buffers internos
columnas necesarias habilidad de leer a través de utilizados por el cliente son
en una instrucción las páginas de índices cuando de un tamaño fijo. Mientras
select las columnas mencionadas, más data se seleccione,
son las que intervienen en un más context switch se
índice en particular, este tipo requerirá para enviar la
de lectura es la más rápida y data desde el servidor al
eficiente cliente. El llenar los buffers
implica mayor tráfico entre
el cliente y el proceso del
servidor, lo cual tiene un
impacto directo en el
performance.
En una instrucción Ninguna Cuando se actualiza una
update especifique tabla indexada, no solo se
solo las columnas que actualizan las páginas de
se han cambiado, evite datos, sino también las
actualizar las páginas de cada índice.
columnas involucradas Actualizar el valor de una
en un índice clave implica : buscar en el
árbol B+tree hasta ubicar la
clave, borrar esa entrada
del índice, buscar la nueva
ubicación de la clave e
insertar el nuevo valor. Este
proceso se repite por cada
índice en el cual esté
involucrado las columnas
afectadas, por lo tanto
24
mayor tiempo se requiere
para realizar la
actualización.
Subqueries Simplifica la búsqueda de La utilización de
datos. subqueries puede bajar el
performance del sistema,
en casos donde se prevé
que las tablas involucradas
no exceden de
aproximadamente 15.000
registros pudiera utilizarse,
pero en casos contrarios
es conveniente la
utilización de tablas
temporales.
Uso de cursores scroll Acceso directo a registros Con este tipo de cursor se
dentro de un lote consultado crean tablas temporales
para realizar el acceso
directo, incurriendo en una
sobrecarga en espacio y
tiempo, tiempo para
procesar y escribir los
registros a una tabla
temporal, y espacio para
mantenerla. Esta
sobrecarga degrada el
proceso, especialmente
cuando se selecciona una
gran cantidad de registros.
Sleep N Detiene la ejecución por N Su uso es
segundos contraproducente para los
tiempos de respuesta.
Utilización de Realizar cálculo matemáticos Pueden desmejorar los
funciones matemáticas durante la ejecución de tiempos de respuesta del
como sqrt(), sin(), tan() instrucciones sql. sistema, cuando se tenga
en las instrucciones la necesidad de utilizar
sql. algunas de las funciones
matemáticas que ofrece
SQL, es necesario
verificar el tamaño de las
tablas involucradas el cual
no debe ser mayor a
10000 registros, en caso
contrario es necesario
utilizar cursores y a través
de funciones matemáticas
procesar la data, registro
por registro y realizar los
cálculos ; la explicación es
que el manejador no está
25
orientado a realizar
cálculos, sino funciones
de base de datos, por lo
cual no es eficiente en
esta área.
Utilizar la opción -s en Comprime el ejecutable final. Reduce el espacio ocupado
la compilación : por el ejecutable.
c4gl -s Esto hace que durante la
ejecución exista menos
probabilidad de realizar
swapped out de los
programas.
Uso de variables Es la manera más eficiente de Su uso tiene un gran
globales tener acceso a la data durante impacto en la memoria
la ejecución de un programa. requerida para la ejecución
del programa, por lo cual se
recomienda limitar el uso
de variables globales.
Esto a su vez hace que el
mantenimiento de los
programas se simplifique.
Cuando una variable global
cambia, hay que propagar
este cambio en todos los
programas que la usan.
Si una variable global no se
utiliza correctamente, son
causantes de errores
lógicos, a las cuales es
difícil de realizar un
seguimiento.
Uso de variables Su principal ventaja es el uso Su uso hace que los
locales. eficiente del recurso memoria programas sean fáciles de
mantener, y de realizarles
un seguimiento.
Instrucciones Let e La instrucción let trabaja Limitar el uso de la
Initialize copiando en base a copia de instrucción initialize dentro
bytes. de ciclos repetitivos, como
La instrucción Initialize trabaja es el caso de la
en base a llamadas a inicialización de un arreglo
subrutinas. de registros, es más
eficiente realizar la
inicialización para la fila 1, y
el resto con la instrucción
let, ejemplo :
for i = 1 to n
initialize arr[i].* to null
end for
cambiar a :
initialize arr[1].* to null
26
for i = 2 to n
let arr[i].* = arr[1].*
end for
En caso de un arreglo de
un tipo de datos simple, por
ejemplo enteros, es
eficiente utilizar la
instrucción :
initialize arr to null.
Llamadas a funciones Permite estructurar y Al retornar valores desde
organizar un programa, lo cual las funciones, utilizar
incide en el uso de bloques de cualquiera de las siguientes
instrucciones comunes. alternativas :
let var = f_nombre()
o
if (f_nombre() = expresion)
then
Cualquiera de ellas es más
eficiente antes que utilizar
la cláusula returning. Sin
embargo al devolver más
de un valor desde la
función es inevitable utilizar
esta cláusula.
Reabrir cursores Actualiza el conjunto de La instrucción open asigna
registros bajo las condiciones buffers de datos al proceso,
de la definición del cursor y el y la instrucción close libera
contenido actual de las los recursos asignados. Si
variables involucradas en la un cursor abierto es
definición del mismo. nuevamente abierto sin
Hay una excepción cuando se cerrarlo se actualizan los
utilizan sub-índices en una datos sin incurrir en
definición de cursor, esta sobrecarga de asignación
variable mantiene su valor de buffers porque el
original y no el valor al proceso ya los tiene.
ejecutar el open del cursor Al terminar de usar el
cursor se debe cerrar el
mismo para así liberar
recursos.
Instrucción Free Libera recursos del servidor El proceso mantiene
de base de datos asignados a recursos hasta que termina
una instrucción prepare o un la sesión.
cursor. Al liberar memoria puede
ser reutilizada por otros
procesos.
Cursores de inserción Inserta los registros en un Al no usar se genera un
de datos. buffer en la memoria del mayor tráfico en la red,
cliente, cuando se llena envía incidiendo en el
todos estos registros al performance.
servidor, incrementando el
27
performance.
Debe utilizarse Al no usar la instrucción
adicionalmente la instrucción flush antes de cerrar la
flush. transacción se corre el
riesgo de que se queden
registros en el buffer y se
pierdan. El vaciado del
buffer es automático al
llenarse, por lo tanto para
asegurar que los últimos
registros vayan a la tabla
hay que obligarlo con esta
instrucción.
Tecla de aceptación Es la tecla de aceptación por Su uso provoca una espera
ESC defecto. por la siguiente tecla, esto
se debe a que en Unix se
tienen teclas que
comienzan por ESC, e
Informix espera un segundo
adicional para determinar si
es verdaderamente un ESC
o no, con cualquier otra
tecla que no use el ESC, se
logra evitar este instante de
espera.
Stored procedures Al pasar código a la base de Al no usar no se aprovecha
datos incide en menor tráfico la capacidad máxima que
de datos en la red, ya que se ofrece el manejador OnLine
envía una solicitud de 7.X, quien permite realizar
ejecución desde el cliente, operaciones de cache de
junto con unos parámetros, el stored procedures en
proceso se realiza en el memoria, optimización del
servidor quien envía una código para obtener mejor
respuesta al finalizar, performance. Sin embargo
mejorando el performance, el exceso de stored
simplificando la programación procedures degrada el
y el mantenimiento de performance, para ello se
programas. Se utiliza para debe trabajar en conjunto
ejecutar tareas repetitivas, que con el dba, quien
se comparten con muchos determinará la incidencia y
usuarios. ajustes en el ambiente para
evitar la degradación.
Uso de la instrucción Produce una espera cuando Al indicar una espera, debe
set lock mode to los registros a los cuales se tomarse en cuenta que los
wait quiere acceder están registros que se hayan
wait bloqueados. modificado dentro de la
not wait Por defecto se trabaja en transacción estarán
modo not wait. bloqueados y no
disponibles para otros
usuarios, por lo tanto se
28
crea contención de
recursos, y por ende reduce
la concurrencia y baja el
performance.
Se recomienda su uso con
precaución, solo en
procesos críticos.
Procesos en Permite la ejecución de Al no usar el primer
background procesos concurrentemente. proceso tiene que esperar a
que termine el segundo, se
ejecutan en forma serial.
A menos que no se
entremezclen las tareas o
que un proceso dependa
del otro, se pueden ejecutar
en paralelo con la
instrucción run programa
without waiting. Esto mejora
considerablemente el
performance en este tipo de
procesos.
Declaración de Cuando la cantidad de Su uso es completamente
cursores registros a extraer de la base necesario, sin embargo hay
de datos es desconocida, o que tomar en cuenta que :
son muchos registros se tiene no se debe realizar la
que usar la estructura de declaración dentro de
cursores para la manipulación estructuras cíclicas, por el
de los registros. contrario se realiza la
En el caso de cursores de declaración del cursor fuera
inserción se utilizan para lograr del ciclo, y en cada
mayor performance. iteración se abre el cursor.
Uso de la instrucción Esta instrucción simplifica la Al usar esta instrucción hay
foreach. construcción de un ciclo, ya que tener cuidado, si
que se escribe menos líneas culmina su ejecución hasta
de código. Esta instrucción recorrer todo el conjunto de
realiza el open del cursor, registros, el cursor se cierra
comienza un ciclo extrayendo automáticamente, pero si
en cada paso un registro, y al se ejecuta la instrucción
terminar cierra el cursor. exit foreach, el cursor
permanecerá abierto, y por
ende consumiendo
recursos de memoria.
No debe utilizarse la
construcción siguiente :
foreach cursor1 into r1.*
...
foreach cursor2 into ..
...
foreach cursor3 into ....
....
29
end foreach
...
end foreach
...
end foreach
en la cual se observe un
ciclo foreach dentro de otro.
La razón es el performance,
esto es equivalente al caso
mencionado en el punto de
reabrir cursores.
Cada foreach, abre y cierra
cursor, lo cual implica
asignación y liberación de
buffers, esto se evita
utilizando en los ciclos
internos open de cursores,
sin cerrarlos dentro de los
ciclos.
Sin importar la cantidad de
niveles, sólo el nivel más
externo puede usar el
foreach, los niveles internos
deben ser open y un ciclo
para realizar los fetch
consecutivos.
Procesos iterativos de Debido a las diferencias de Cuando se realizan ciclos
búsqueda de registros. tamaño que se presentan en repetitivos para pocos
las tablas, existen algunas registros, se pueden
recomendaciones a seguir realizar otros select dentro
cuando se realizan ciclos del ciclo para minimizar el
repetitivos para pocos tiempo que se pierde
registros y para miles de haciendo un select
registros en beneficio del complejo de muchas tablas
performance. en un mismo cursor .
En cambio cuando se
realizan ciclos repetitivos
para miles de registros
(mas de 100.000) es
conveniente seleccionar
toda la data que se va a
procesar y en el ciclo
repetitivo realizar
solamente el reporte,
comparaciones o
asignaciones, sin realizar
otros select. Deben tenerse
en consideración los puntos
sobre uso de temporales,
columnas seleccionadas,
30
preparación de
instrucciones y uso de
stored procedures.
Set pdqpriority # El uso de prioridades trae Por defecto las prioridades
beneficios si se cumple con: están desactivadas al
Tener como mínimo 2 menos que se invoque a la
procesadores, tablas sentencia. Puede tenerse
fragmentadas y los parámetros efectos contrarios el uso, ya
de configuración afinados. que si por ejemplo 5
La funcionalidad hace uso del sesiones suman el 90 de
paralelismos en los querys, prioridad y una sexta (o
creando mas thread para la mas sesiones) sesión con
ejecución de un query. prioridad 20 tendrá que
La asignación de prioridad a esperar dicha disponibilidad
una sesión puede ser de 0 a de recursos.
100, siendo 0 desactivado y
100 el mas alto y el valor El uso debe ser controlado.
significa cuanto de recursos se
le va asignar a la sesión para
la ejecución de un query.
“trace” en Store Permite realizar un
procedure seguimiento al código de los
store procedure. El uso debe
ser en la etapa de desarrollo.
No se permite su uso en los
ambientes de producción.
“Explain” o plan de El uso de la sentencia “set Su uso permite optimizar
ejecución de querys explain on” permite ver parte los query en la etapa de
del plan de ejecución de un desarrollo. Se debe evitar
query en el archivo en los ambientes de
“sqexplain.out” creado en el producción.
directorio actual.
En la versión 7.31 y posterior
teniendo el explain en off,
puede verse el plan de
ejecución de un query en
particular usando :
31
7. Generalidades
32
8. Funcionalidades del Informix
Select NVL(dirección, ‘
Dirección errada’)
From tabla1 ...
Case Permite obtener distintos Evitar expresiones
resultados a través de una complejas, por cada fila la
expresión case. Ej: expresión es evaluada.
Select cust_name. Es importante que se
CASE coloque una expresión en
WHEN num_probs = 0 el “ELSE” para evitar
THEN 100 valores perdidos.
WHEN num_probs > 0 AND
Num_probs < 4
THEN num_probs * 500
ELSE num_probs
END n_probs,
Cust_address
From customer
Decode Similar a la sentencia CASE, Evitar expresiones
la expresión se trabaja como complejas, los mismos
una función. Ej: criterios que la sentencia
Select DECODE(City, CASE.
“Menlo Park”, “Local”,
“Palo Alto”, “Tall Tree”,
city)
from customer
33
GLS Functionality.
Substr(columna, Inicio) Subtrae cadenas de una
Substr(expresión, expresión string. Ej:
Inicio) select
substr('ABCDEFG',
-3),
substr('ABCDEFG',
0),
substr('ABCDEFG', 3)
from tabla
Resultado:
34