Browse Tag: Performance

Cómo Calcular Número Transacciones en Base de Datos

¿Qué es una transacción?

Una transacción es una unidad lógica de trabajo que comprende una o más sentencias SQL a cargo de un único usuario. De acuerdo con el estándar SQL ANSI / ISO, con los que es compatible Oracle, una transacción comienza con una primera instrucción SQL ejecutable del usuario. Una transacción termina cuando se realiza un COMMIT o ROLLBACK por parte del usuario de forma explícita.

Las transacciones son definidas por la aplicación, no por la Base de Datos. COMMIT y ROLLBACK es la forma en que la Base de Datos registra las transacciones, pero no como se definen.

Calcular transacciones en Base de Datos

  • SQL para calcular el número medio de transacciones por segundo desde que inicio la Base de Datos:

select round(sum(s.value / (86400 * (SYSDATE – startup_time))),3) “TPS” from v$sysstat s ,v$instance i where s.NAME in (‘user commits’,’transaction rollbacks’);

  •  Con la siguiente query podemos determinar los “commit y rollback de usuario” a una determinada hora y ejecutarlo más tarde para ver el incremento de transacciones:

select to_char(sysdate,’DD-MM-YYYY HH:MI:SS’), sum(value) sum from v$sysstat where name like ‘user commits’ or name like ‘user rollbacks’;

  • Podemos llevar a cabo el siguiente procedimiento para saber el número de sentencias select/delete/update/insert ejecutadas contra la Base de Datos:

Asegurar que la auditoría está activada

connect / as sysdba
ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;
shutdown immediate
startup

AUDIT SELECT TABLE, UPDATE TABLE, INSERT TABLE, DELETE TABLE BY ACCESS;

Ejecutamos la sentencia para ver el resultado:

SELECT count(*), action_name FROM dba_audit_trail WHERE timestamp between <fecha_inicio> and <fecha_fin>;

Slow Performance y Foreign Keys

Cuando una tabla tiene una foreign key sin índice y se produce un DELETE o UPDATE en la tabla padre, un “shared lock” es requerido en la tabla hija. Aunque este bloqueo es liberado inmediatamente después de obtenerse, podemos apreciar una degradación de rendimiento del sistema en DML concurrentes en tablas padre e hija.

Si la foreign key es indexada no se producirán bloqueos de tabla de ningún tipo en la tabla hija como resultado del INSERT, UPDATE o DELETE.

Por esta razón es importante a la hora de crear una foreign key, ver que uso se le va a dar y si es necesario indexarla para evitar problemas de rendimiento en la aplicación.

Este problema me lo he encontrado en algunas aplicaciones, cuando intentaban realizar un DELETE de una fila, el sistema era más lento de lo habitual. Lo mismo ocurría al intentar realizar un import de la misma tabla.

Después de comprobar que el plan de ejecución del DELETE era correcto, activé la traza para la sesión en concreto que estaba realizando la operación y me di cuenta que estaba realizando un FULL TABLE SCAN de la tabla hija, la cual tenía la foreign key sin indexar.

Tan pronto como desactivé la foreign key o creé un índice para dicha foreign key todo empezó a ir mucho más rápido.