martes, 13 de marzo de 2012

ORACLE TUNING

Una de las mayores responsabilidades de un DBA es garantizar que la base de datos de Oracle se sintoniza correctamente. El RDBMS de Oracle es altamente tuneable y permite que la base de datos para ser monitoreados, regulados para optimizar y aumentar el rendimiento de la BD.

¿QUE GANAMOS AL TUNEAR?

- Mejorar el tiempo de respuesta de la base de datos.
- Disponibilidad de servicio de la base de datos.
- Mejorar el uso de la memoria.
- Mejorar de porcentaje de hits.
- Pocas esperas de los recursos (waits).


¿QUÉ PODEMOS OPTIMIZAR?

- Sentencias SQL y PL/SQL.
- Diseño lógico de la base de datos.
- Diseño físico de la base de datos.
- Parámetros de la base de datos.
- Sistema operativo y hardware.


¿QUÉ MECANISMOS PODEMOS REALIZAR PARA HACER UN : AUTOMATIC SQL TUNING ?.

Se puede realizar AUTOMATIC SQL TUNING usando:

- SQL TUNING ADVISOR
- SQL ACCESS ADVISOR


DUMMY #1:

En esta oportunidad mostrare el manejo del: SQL TUNING ADVISOR, desde la creación de las tablas hasta el de los QUERYs y DECLARE que brindan el soporte al Tuning respectivo.

-- ================================================= --
-1- CREAR TABLAS, INSERTs Y CONSTRAINTs PARA EL DUMMY --
-- ================================================= --
CODIGO en el adjunto [AL FINAL].

-- ========================== --
-2- CREAR LA [TAREA DE TUNING] --
-- ========================== --
[CÓDIGO AL FINAL].

-- ============================================== --
-3- VERIFICAR QUE LA [TAREA DE TUNING] ESTE CREADA --
-- ============================================== --
[CÓDIGO AL FINAL].

-- ==================================== --
-4- EJECUTAR LA [TAREA DE TUNING] CREADA --
-- ==================================== --
[CÓDIGO AL FINAL].

-- =========================================== --
-5- CONTROLAR EL ESTADO DE LA [TAREA DE TUNING] --
-- =========================================== --
[CÓDIGO AL FINAL].

-- ============================================== --
-6- CONTROLAR EL PROGRESO DEL [SQL TUNING ADVISOR] --
-- ============================================== --
[CÓDIGO AL FINAL].

-- ============================================= --
-7- MOSTRAR EL RESULTADO DEL [SQL TUNING ADVISOR] --
-- ============================================= --
[CÓDIGO AL FINAL].

-- ==================================== --
-8- ELIMINAR LA [TAREA DE TUNING] CREADA --
-- ==================================== --
[CÓDIGO AL FINAL].


DUMMY #2:

En este DUMMY mostrare la diferencia al desarrollar QUERYs: CON y SIN INDICES, mediante un análisis por medio de: EXPLAIN PLAN TOOL.

Creamos la TABLA y generamos los INSERTs respectivos (200000 registros):

Mediante la herramienta PL/SQL DEVELOPER accedermos a la vista de EXPLAIN PLAN:

PRUEBA #1 (SIN APLICACIÓN DE INDICES): Ejecutaros un QUERY que lo FILTRAREMOS mediante 2 variables de tipo BIND que representan a cualquier posible variable a reemplazar.

PRUEBA #2 (SIN APLICACIÓN DE INDICES): Ejecutaros un QUERY que lo FILTRAREMOS mediante 2 parámetros de búsqueda.

IMPORTANTE: El RESULTADO al ejecutar el QUERY con PARAMETROS FIJOS y con VARIABLES BIND, NO siempre es el mismo, así que uno NO DEBE CONFIAR.

Ahora PROBAREMOS los QUERYs anteriores pero antes le CREAMOS y asignaremos un INDEX para mejorar y optimizar los
FILTROS en base a los dos parámetros de tipo VARCHAR2.

PRUEBA #3 (CON APLICACIÓN DE INDICES): Ejecutaros el mismo QUERY de la PRUEBA #1, FILTRANDOLO mediante 2 variables de tipo BIND que representan a cualquier posible variable a reemplazar.

PRUEBA #4 (CON APLICACIÓN DE INDICES): Ejecutaros el mismo QUERY de la PRUEBA #2, FILTRANDOLO mediante 2 parámetros fijos.

CONCLUSIONES:

Es notorio que al aplicar un correcto manejo de INDICES el rendimiento en la consulta SQL es mayor y optimizado, decrementando considerablemente en recursos como: COST y en BYTES.

Para un mejor entendimiento del TEMA posteado (CÓDIGO) podemos descargar el TUTORIAL paso a paso de: AQUI.

jueves, 1 de marzo de 2012

MANEJO SQLLOADER

En esta oportunidad mostrare el manejo de una herramienta muy útil, al momento de trabajar con procesos automáticos SQLLOADER:

SQLLOADER es una herramienta que te permite acceder a una conexión a BD ORACLE y a la vez cargar datos desde un Fichero de forma masiva en base a un archivo de configuración.

Los pasos son los siguientes para el desarrollo del DUMMY:

I. PASO #1:
Crearemos una tabla donde se cargarán los datos en base a la ejecución del SQLLOADER. La tabla la llamaremos: TB_USUARIO.

CONTENIDO:

CREATE TABLE TB_USUARIO(
ID NUMBER NOT NULL,
NOMBRES VARCHAR2(30) NULL,
APELLIDOS VARCHAR2(30) NULL,
DISTRITO VARCHAR2(30) NULL,
CUMPLEANOS DATE NULL
);


ALTER TABLE TB_USUARIO
ADD CONSTRAINT PK_TB_USUARIO PRIMARY KEY( ID );

II. PASO #2:
Acceder al servidor desde consola vía un Telnet:

Telnet SERVER_IP

- User: XXX
- Password: XXX


III. PASO #3:
Crea un fichero (Shell) llamado: TB_USUARIO_EJECUCION.sh, que servirá para la ejecución del proceso de carga.

Verificar que las variables de entorno estén seteadas, sino como por ejemplo la del $TNS_ADMIN se solicitara desde consola el seteo del PASSWORD.

CONTENIDO:

#!/bin/ksh

# CONEXION A ORACLE FROM SHELL #

banner 'SQLLOAD'

echo $CLASSPATH
echo $ORACLE_HOME
echo $TNS_ADMIN

echo '--------- ANTES EJECUCION ---------'

## ORACLE_USER@ORACLE_INSTANCIA
## PARA QUE RECONOZCA LA UBICACIÓN DE LOS FICHEROS => [ ./ ]
sqlldr RGUERRA@xe control=./TB_USUARIO_CONFIGURACION.ctl data=./TB_USUARIO_DATA.txt

echo '-------- DESPUES EJECUCION --------'

IV. PASO #4:
Crear un fichero (.ctl) llamado: TB_USUARIO_CONFIGURACION.ctl, donde se configurará la tabla de la BD, sus campos, los tipos y los limitantes entre campo y campo.

CONTENIDO:

LOAD DATA
APPEND INTO TABLE TB_USUARIO
(
ID INTEGER EXTERNAL TERMINATED BY "~",
NOMBRES CHAR TERMINATED BY "~" ENCLOSED BY '"',
APELLIDOS CHAR TERMINATED BY "~" ENCLOSED BY '"',
DISTRITO CHAR TERMINATED BY "~" ENCLOSED BY '"',
CUMPLEANOS DATE "DD-MM-YYYY"
)

V. PASO #5:
Simular el fichero que será dejado por otro aplicativo para la carga masiva. En este caso al fichero le llamaremos: TB_USUARIO_DATA.txt

CONTENIDO:

001~"CESAR RICARDO"~"GUERRA ARNAIZ"~"LOS OLIVOS"~04/09/1980 01:43:11 AM
002~"JUAN JOSE"~"VERA PALOMINO"~"BARRANCO"~03/12/1972 01:43:11 AM
003~"CARLOS ALONZO"~"MONZON PEREZ"~"LIMA"~09/09/1983 01:43:11 AM
004~"DILVER MAURICIO"~"CUSCANO RAIMOND"~"LA MOLINA"~02/09/1981 01:43:11 AM
005~"CARLA GUIANELA"~"ROMAN URBINA"~"CALLA"~07/10/1975 01:43:11 AM

VI. PASO #6:
Antes y después de cada ejecución de la SHELL es necesario que se limpie la tabla para ver el efecto de cada:

LIMPIO TABLA:
TRUNCATE TABLE TB_USUARIO;

MUESTRO TABLA:
SELECT * FROM TB_USUARIO;

EJECUCION:
Desde el directorio de ubicación de los ficheros respectivos brindar los permisos de ejecución respectivos: chmod 777 *.sh, luego ejecutar la SHELL:

sh TB_USUARIO_EJECUCION.sh


Para un mayor detalle de los comando utilizados, descargar el TUTORIAL pulsando Aquí

CREACIÓN & CONFIGURACIÓN DE LINUX - UNIX CRON

Hola en esta oportunidad mostrare el manejo de algo muy utilizado para el manejo de procesos automatizados, es el manejo de Cron en Linux y/o Unix.

Para el desarrollo de esta solución DUMMY se ha aplicado una configuración en la cual se requiere de tener los siguientes archivos:

• linuxCronCRA.cron = Archivo utilizado para la creación de un crontab especifico del usuario Linux.
Aquí se configurara la periodicidad de ejecución del proceso respectivo.

• linuxCronCRGA.sh = Linux Shell Script encargado de ejecución de un proceso cada cierto tiempo configurado.

• logLinuxCronCRGA.txt = Archivo Log generado por la ejecución del Linux Shell Script.


I. CONFIGURACIÓN DE CRON: (linuxCronCRA.cron)
Aquí se creara un archivo para la ejecución periódica del Script, en base a unos estándares de configuración y especificando la ruta de ubicación de dicho Script.

* * * * * Script a ser ejecutado.
| | | | |____ Día de la semana (0 - 7) (Domingo=0 o 7)
| | | |_____ Meses (1 - 12)
| | |_______ Día del Mes(1 - 31)
| |________ Hora (0 - 23)
|_________ Minutos (0 - 59)

MINUTO = Controla el minuto de la hora en que el comando será ejecutado, este valor debe de estar entre 0 y 59.

HORA = Controla la hora en que el comando será ejecutado, se especifica en un formato de 24 horas, los valores deben estar entre 0 y 23, 0 es medianoche.

DIA DEL MES = Día del mes en que se quiere ejecutar el comando. Por ejemplo se indicaría 20, para ejecutar el comando el día 20 del mes.

MES = Mes en que el comando se ejecutará, puede ser indicado numéricamente (1-12), o por el nombre del mes en inglés, solo las tres primeras letras.

DIA DE SEMANA = Día en la semana en que se ejecutará el comando, puede ser numérico (0-7) o por el nombre del día en inglés, solo las tres primeras letras. (0 y 7 = domingo).

USUARIO = Usuario que ejecuta el comando.

COMANDO = Comando, script o programa que se desea ejecutar. Este campo puede contener múltiples palabras y espacios.


Un asterisco * como valor en los primeros cinco campos, indicará inicio-fin del campo, es decir todo. Un * en el campo de minuto indicará todos los minutos.

01 * * * * = Se ejecuta al minuto 1 de cada hora de todos los días.
15 8 * * * = A las 8:15 a.m. de cada día
15 20 * * * = A las 8:15 p.m. de cada día
00 5 * * 0 = A las 5 a.m. todos los domingos
* 5 * * Sun = Cada minuto de 5:00a.m. a 5:59a.m. todos los domingos
45 19 1 * * = A las 7:45 p.m. del primero de cada mes
01 * 20 7 * = Al minuto 1 de cada hora del 20 de julio
10 1 * 12 1 = A la 1:10 a.m. todos los lunes de diciembre
00 12 16 * Wen = Al mediodía de los días 16 de cada mes y que sea Miércoles
30 9 20 7 4 = A las 9:30 a.m. del día 20 de julio y que sea jueves
30 9 20 7 * = A las 9:30 a.m. del día 20 de julio sin importar el día de la semana
20 * * * 6 = Al minuto 20 de cada hora de los sábados
20 * * 1 6 = Al minuto 20 de cada hora de los sábados de enero
23 0-23/2 * * * = A los 23 minutos después de la media noche, 2am, 4am, todos los días.
0 22 * * 1-5 = A las 10 pm los fines de semana.

También es posible especificar listas en los campos. Las listas pueden estar en la forma de 1,2,3,4 o en la forma de 1-4 que sería lo mismo. Cron, de igual manera soporta incrementos en las listas, que se indican de la siguiente manera:

59 11 * 1-3 1,2,3,4,5 = A las 11:59 a.m. de lunes a viernes, de enero a marzo
45 * 10-25 * 6-7 = Al minuto 45 de todas las horas de los días 10 al 25 de todos los meses y que el día sea sábado o domingo
10,30,50 * * * 1,3,5 = En el minuto 10, 30 y 50 de todas las horas de los días lunes, miércoles y viernes
/15 10-14 * * * = Cada quince minutos de las 10:00a.m. a las 2:00p.m.
* 12 1-10/2 2,8 * = Todos los minutos de las 12 del día, en los días 1,3,5,7 y 9 de febrero y agosto. (El incremento en el tercer campo es de 2 y comienza a partir del 1)
0 */5 1-10,15,20-23 * 3 = Cada 5 horas de los días 1 al 10, el día 15 y del día 20 al 23 de cada mes y que el día sea miércoles
3/3 2/4 2 2 2 = Cada 3 minutos empezando por el minuto 3 (3,6,9, etc.) de las horas 2,6,10, etc (cada 4 horas empezando en la hora 2) del día 2 de febrero y que sea martes


En nuestro caso el archivo: linuxCronCRA.cron, para ejecución periódica es simple solo deberá ejecutarse 1 vez cada minuto y contendrá:

#!/bin/ksh
# EJECUCION PERIODICA DE [SHELL] - [CRON] #
*/1 * * * * /home/javaman/Desktop/linuxCronCRGA/linuxCronCRGA.sh


Para poder crear/actualizar el archivo propio de crontab por usuario se debe de ejecutar el comando:
$> crontab linuxCronCRA.cron


II. CONFIGURACIÓN DE LINUX SHELL SCRIPT: (linuxCronCRGA.sh)
Este Script simplemente lo que hace es mandar a imprimir un mensaje concatenado con la fecha actual a otro archivo de Log en base a la configuración periódica previa. Aquí se debería ingresar también datos como:
- Lógica de negocio.
- Acceso a BD.
- Etc.


#!/bin/ksh
# TEST LINUX CROM #
cadena1="LA FECHA IMPRESA ES: "
cadena2=`date`
ruta=/home/javaman/Desktop/linuxCronCRGA/logLinuxCronCRGA.txt
echo $cadena1$cadena2 >> $ruta


III. GENERACIÓN EN ARCHIVO DE LOG: (logLinuxCronCRGA.txt)
El contenido del archivo log generado se visualizara de esta manera.
LA FECHA IMPRESA ES: Thu Nov 3 10:03:01 PDT 2011
LA FECHA IMPRESA ES: Thu Nov 3 10:04:01 PDT 2011
LA FECHA IMPRESA ES: Thu Nov 3 10:05:01 PDT 2011
LA FECHA IMPRESA ES: Thu Nov 3 10:06:01 PDT 2011
LA FECHA IMPRESA ES: Thu Nov 3 10:07:01 PDT 2011


IV. EJECUCIÓN POR CONSOLA:

Antes que nada se debe de dar los permisos de ejecución a los archivos SHELLs respectivos en el directorio donde estén ubicados aplicando: chmod 777 *.sh

Luego ya podemos ejecutar:
$> crontab archivo.cron = (Establecerá el archivo.cron como el crontab del usuario).
$> crontab -e = (Abrirá el editor preestablecido donde se podrá crear o editar el archivo crontab).
$> crontab -l = (Listara el crontab actual del usuario, sus tareas de cron).
$> crontab -r = (Eliminara el crontab actual del usuario).


Para un mayor detalle de los comando utilizados, descargar el TUTORIAL pulsando Aquí

miércoles, 22 de febrero de 2012

OBTENER DATOS DE XML STRING

En esta oportunidad detalle la forma de cómo obtener datos de un XML incrustado en una CADENA. Esto nos sera de gran utilidad cuando se nos envie como INPUT una parametro de tipo XML independientemente del formato XML que maneje. Para ellos nos apoyaremos en la realizacion de los DUMMYS de los objetos ORACLE: XMLTYPE, XMLSEQUENCE, EXTRACTVALUE.

I. OBTENER DATOS FROM [XML STRING] #1:
II. OBR DATOS FROM [XML STRING] #2: El contenido de este QUERY podría ya ser cargado en un CURSOR.
III. OBTENER DATOS FROM [XML STRING] #3: El contenido de este QUERY podría ya ser cargado en un CURSOR.

Para un mayor detalle de los comando SQL utilizados, descargar el TUTORIAL pulsando Aquí

ARMAR XML EN BASE A DATOS DE TABLA

En esta oportunidad detalle la forma para el armado de XML en base a los datos propios de una tabla de datos. Para ellos nos apoyaremos en la realizacion de los DUMMYS de los objetos ORACLE: XMLSEQUENCE, XMLFOREST, XMLELEMENT.

1. CREAR TABLA BASE.
2. ARMAR UN XML EN BASE A DATOS DE TABLA: [EJEMPLO #1].
3. ARMAR UN XML EN BASE A DATOS DE TABLA: [EJEMPLO #2].
4. ARMAR UN XML EN BASE A DATOS DE TABLA: [EJEMPLO #3].

Para un mayor detalle de los comando SQL utilizados, descargar el TUTORIAL pulsando Aquí

CLIENTE WEB SERVICE EN ORACLE

El siguiente tutorial muestra el manejo del paquete UTL_HTTP de ORACLE. Dicho paquete UTL_HTTP hace Hypertext Transfer Protocol (HTTP) llamadas de SQL y PL/SQL. Se puede usar para acceder a datos en Internet a través de HTTP.

Con UTL_HTTP, puede escribir programas PL/SQL que se comunican con Web (HTTP) entre servidores. UTL_HTTP también contiene una función que se puede utilizar en las consultas SQL. El paquete también es compatible con HTTP a través del protocolo de Secured Socket Layer (SSL), también conocido como HTTPS, directamente o a través de un proxy HTTP (cliente WS).

El demo propuesto se mostrara una SOLUCION basada en PL/SQL para el consumo a modo cliente de Web Service. Para el ejemplo nos apoyaremos en un Servicio Web ya creado en JAVA y desplegado al cual nos conectaremos para el consumo respectivo de dichos servicios.

El WebService de apoyo se puede descargar desde: Aquí

Ademas, la SOLUCION preparada consta de dos ORACLE PACKAGE. El Dummy mostrara las diferentes formas de consumir un Servicio Web en estos ESCENARIOS:

ESCENARIO #1: [DUMMY #1]
- INPUT: Dos parámetros primitivos (Int, String).
- OUTPUT: Una CADENA con los datos del usuario concatenados.

ESCENARIO #2: [DUMMY #2]
- INPUT: Dos parámetros primitivos ( Int, String ).
- OUTPUT: Un objeto ORACLE TYPE RECORD usuario con los datos del usuario filtrado.

ESCENARIO #3: [DUMMY #3]
- INPUT: Un objeto ORACLE TYPE RECORD para usuario con los datos del filtro.
- OUTPUT: Un objeto ORACLE TYPE RECORD para obtener al usuario con los datos ya filtrado.

ESCENARIO #4: [DUMMY #4]
- INPUT: Dos parámetros primitivos ( Int, String ).
- OUTPUT: Un objeto ORACLE CURSOS con los datos de los usuarios encontrados.

ESCENARIO #5: [DUMMY #5]
- INPUT: Dos parámetros primitivos ( Int, String ).
- OUTPUT: Un objeto ORACLE TABLE OF RECORD con los datos de los usuarios encontrados.

Para un mayor detalle de los comando SQL utilizados, descargar el TUTORIAL pulsando Aquí

sábado, 18 de febrero de 2012

MANEJO ORACLE JOBs

Hola en esta oportunidad mostrare un TUTORIAL que he desarrollado para la explicacion a detalle del manejo de JOBs en ORACLE.

Los JOBs en ORACLE son utilizados cuando se tiene la necesidad de automatizar procesos de forma periodica. ORACLE nos brinda esa facilidad mediante su paquete: "DBMS_SCHEDULER".

Ustedes diran pero lo puedo controlar mediante un UNIX/LINUX CRON, es correcto tambien se podria hacer, pero mediante ORACLE JOB seria de una forma mas directa por ejemplo para la ejecucion de un PROCEDURE periodicamente que desencadenate un flujo completo de procesos.

El TUTORIAL muestra paso a paso la creacion del PERMISO todo lo requerido para el manejo completo de JOB en ORACLE propiamente. Resumiendo el TUTORIAL contiene:

I. CREACION [TABLE].
II. CREACION [PROCEDURE].
III. CREACION [JOB].
1. CREACION DE OBJETO: [PROGRAM].
2. CREACION DE OBJETO: [SCHEDULE].
3. CREACION DE OBJETO: [JOB].
IV. INICIAR & DETENER [JOB].
IV. CONSULTAR ESTADO & EXISTENCIA DE JOB.

Para un mayor detalle de los comando SQL utilizados, descargar el TUTORIAL pulsando Aquí

MANEJO ORACLE DIRECTORY

Hola en esta oportunidad mostrare un Tutorial que he desarrollado para la explicacion a detalle del manejo de DIRECTORY en ORACLE.

ORACLE DIRECTORY: Para el manejo nos apoyaremos en el package "UTL_FILE" propio de ORACLE, el cual nos facilita el poder acceder y manipular archivos desde un PROCEDURE en ruta especifica.

El TUTORIAL muestra paso a paso la creacion del PERMISO requerido, la creacion de los PROCEDURE y del objeto DIRECTORY propiamente. Resumiendo:

I. EJECUTAR PERMISOS:
II. CREACION DIRECTORY:
III. CONSULTAR DIRECTORY:
IV. CREACION DE PROCEDURE:
A. ESCRITURA.
B. LECTURA.
V. PRUEBA DE PROCEDURE.

Para un mayor detalle de los comando SQL utilizados, descargar el TUTORIAL pulsando Aquí