Category: SQL / Programación

SQLT : Una poderosa herramienta para hacer tuning a sentencias SQL



Yo había escuchado hace un tiempo sobre una herramienta que fue generada por el Sr. Carlos Sierra para el centro de soporte Oracle, llamada SQLXEXPLAIN o comúnmente llamada SQLT , nunca la había usado, hasta ayer :)

Es una herramienta buenísima y extremadamente poderosa, que presenta en un formato HTML , todo el análisis sobre una sentencia SQL ya sea que este en un archivo SQL , en memoria o dentro del AWR, en sintésis si quieres hacer un tuning de calidad, pues he aquí la solución



He aquí un pequeño uso de esa herramienta

Uso básico del SQLT

by Ligarius
14.07.11. 09:30:47. 104 words, 10518 views. Categories: SQL / Programación, Tuning / Performance ,

PL/SQL : Creando una máquina del tiempo



Tiempo atrás leí un artículo muy bueno de Arup Nanda ,

Elegido como el mejor Dba del año 2003 por Oracle Corp , este artículo comienza con el título

Get a Movie, Not a Picture: Flashback Versions Query

Y me dije , "Vaya, que diablos crearon..."

Y me puse en una actitud "pensativa"




Pues bien , en este artículo explica el uso de una especie de FlashBack Query , pero con el "historial" de DMLs que se ha generado para esa tabla , para ello utiliza una nueva característica de Oracle 10g y claro es llamada FlashBack Query Version

Y es de verdad muy útil, se puede rescatar cada sentencia e ir recomponiendo "el muertito"

Pero ahí viene el problema , ¿qué pasa con los pobres mortales que utilizamos Oracle9i? , pues sencillo Larry no penso en eso, es obvio..... por lo tanto me puse a pensar como podía hacer algo similar, sin que sea tan ostentoso ni oneroso, y llegué a una solución, pero que en vez de ir diciendo el historial , entrega la diferencia entre una tabla y la misma tabla consultada con Flashback Query, y resulta interesante darse cuenta de muchas cosas que pasan , cuando hacemos Disconnect en nuestros monitoreos jaja

Obviamente este script adolece de un problema, no muestra el historial, pero podríamos buscarle una solución... ¿o no? (FlashBack Version Query)

Bueno eso, espero que sirva de algo y no quede por allí impreso y puesto en algún baño de pueblo :S

Código de la máquina del tiempo

Ejecuten el código y verán que da muy buenos resultados


by Ligarius
03.11.10. 22:08:44. 271 words, 13258 views. Categories: Base de datos, SQL / Programación ,

SQL : Como contar los registros de las tablas de usuarios en una sola consulta



Este es un script que encontré por la Web , y que está bastante padre (a lo mexicano), pues en una sola consulta cuenta la cantidad de registros de todas las tablas de un esquema en partícular



La consulta

select table_name ,
to_number(extractvalue(dbms_xmlgen.getXMLtype ('select count(*) cnt from '||table_name),
'/ROWSET/ROW/CNT')) "Cantidad de filas"
from dba_tables
where owner like '%NOMBRE USUARIO%'
/

¿Práctico cierto?

Espero les sirva


by Ligarius
23.03.10. 07:13:40. 78 words, 14410 views. Categories: SQL / Programación ,

Como crear ROLES de consulta sobre toda la base de datos, de forma fácil



La pregunta es la siguiente

".. Necesito generar un usuario que sea de sólo lectura para toda mi base de datos .."

Pues bien , eso se puede hacer con el siguiente script

click en el LINK



, los pasos para llevarlo a cabo

1.- Copiar el archivo a una ruta fácil de repetir :yes: , no colocar en Documents and Settings, etc ..etc ..etc ;D


2.- Ejecutar el archivo de la forma

sqlplus usuario/password@string_conexion @archivo.sql

3.- En el script va a aparecer una consulta con respecto al nombre del usuario

Ingrese usuario a crear con solo roles de lectura :

4.- Además aparece una pregunta si es VoC ,

V = Implica que se mostrará el comando (Visualizar)
C = Implica que se ejecutará el comando (Crear)

Desea visualizar o crear (V o C)? :

5.- Con lo anterior se crearán roles con el prefijo ROLSER_nombre_de_esquema

6.- Se creará el usuario con grant de connect y se le asignarán todos los roles generados

En resumidas cuentas, un comando , para esa ingrata tarea ... de enrolar

Espero les sirva

by Ligarius
26.01.10. 14:00:00. 180 words, 14737 views. Categories: Base de datos, SQL / Programación, Cosas varias, Sql*Plus ,

Oracle10gr2 : Disminuyendo el LOG FILE SYNC con COMMIT NOWAIT


Para comenzar la charla , les pido disculpas por el tiempo alejado de las canchas, pero fue única y exclusivamente por la carga de trabajo que tenía en mi empresa, de hecho hoy en día me encuentro dictando dos cursos por día :

- Horario de tarde : WorkShop II Ed 3 de Oracle10g
- Horario de noche : Oracle Reports Builder 11g

Así que imagínense el tiempo que tengo, pero bueno... a lo que vinimos...



El evento de espera LOG FILE SYNC se da cuando una sesión de usuario ejecuta un final de transacción por ejemplo un COMMIT o un ROLLBACK , la información almacenada en el Log Buffer para esa transacción necesita ser envíada a disco , especificamente a los archivos de redolog, cuando está finaliza , la sesión recién comienza a generar otras actividades, en otras palabras, cuando se ejecuta un término de transacción la sesión entra en un evento de espera, que está relacionado al tiempo que demora el LGWR en escribir las entradas del log buffer (en realidad son vectores, pero es materia de otro Post) hacía los redologs, cuando eso finaliza .. la transacción se acepta como válida.


A veces , cuando la aplicación es muy transaccional , el LOG FILE SYNC , aparece como un Top 5 dentro del Statspack o dentro un AWR Rpt, cuando sucede eso, hay formas de mejorar esos tiempos de respuesta.



Observación : No se recomienda llevar a cabo estos cambios sin la visación de Oracle Support




Ejecución de commit asincrónico

Como ya vimos el proceso del commit y como se vaciaban los registros desde el Log Buffer , pasamos a señalar el como ejecutar el commit asincrónico para solucionar el evento de espera LOG FILE SYNC


El comando commit posee variaciones , las cuales se pueden apreciar en el siguiente detalle
WAIT : No se retorna el mensaje de commit exitoso hasta que las entradas del LogBuffer hayan sido escritas a los redo logs

NOWAIT : El commit puede retornar el control a la aplicación aunque aún la sentencia no este registrada a los archivos de redologs, lo cual puede resultar algo peligroso.

IMMEDIATE : El proceso LGWR escribe de forma inmediata la entrada de la transacción presente en los log buffer hacía los redo logs, en otras palabras , se fuerza un I/O

BATCH : Este modo le indica a Oracle que a pesar de haber finalizado la transacción con un commit, la bajada de los vectores desde el log buffer se produzca en el ciclo normal del log buffer , por ejemplo , cuando se llena a un tercio

Por defecto , cuando ustedes ejecutan el commit se ejecuta con WAIT IMMEDIATE , pero esto se puede modificar ejecutando la siguiente sentencia

COMMIT WRITE NOWAIT IMMEDIATE , o sea, no espera a que se escriba la información del log buffer a los redo logs, entrega el control a la aplicación y hace la bajada de la información del log buffer de forma inmediata a los redo logs

Es una opción que hay que manejar con cuidado , pues puede haber pérdida de datos , por ejemplo este comando

COMMIT WRITE NOWAIT BATCH , puede dejar mucha información en memoria , indicarles que se hizo el commit exitoso y ante una caída quedar con información inconsistente.

Todo lo anterior también se puede setear mediante el parámetro de incialización correspondiente

COMMIT_WRITE

Y analizando toda esta información , para solucionar en parte el evento de espera LOG FILE SYNC , se podría cambiar el modo del commit para los procesos batch de la siguiente forma

COMMIT WRITE NOWAIT BATCH

Espero que les haya servido

Documentación necesaria
Parámetro COMMIT_WRITE
Evento de espera LOG FILE SYNC


by Ligarius
02.12.09. 13:23:18. 632 words, 7556 views. Categories: Oracle 11g, Oracle 10g, SQL / Programación, Tuning / Performance ,

1 2 >>