domingo, 2 de octubre de 2011

Estadisticas de sistema para Oracle 9i



En versiones anteriores a 10g todo absolutamente todo lo relacionando con el motor recaía en el ser humano que tuviese la responsabilidad de velar por la base de datos. Como todo acto de un ser humano el mismo estaba sujeto a error, olvidos, desconocimiento, (la peor de todas) decidía,...etc.



Para que el optimizador de sentencia pueda elaborar el mejor plan de ejecución posible debe contar con las estadísticas del sistema donde “vive” la base de datos. Para tal fin le muestro el siguiente ejemplo:


Primero que nada vamos a usar la herramienta explain plan for  para mostrar el plan de ejecución de  un simple select sobre nuestra tabla de ejemplo EMP2 del usuario SCOTT

SQL> explain plan for select * from scott.emp2;
explain plan for select * from scott.emp2
                                     *
ERROR at line 1:
ORA-02402: PLAN_TABLE not found

Uupss olvide crear la tabla PLAN_TABLE, lo resolvemos de la siguiente forma:


SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql

Table created.

SQL> explain plan for select * from scott.emp2;

Explained.

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);


PLAN_TABLE_OUTPUT
--------------------------------------------------------------------
| Id  | Operation                        |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                  1792 | 66304 |     3 |
|   1 |  TABLE ACCESS FULL   | EMP2         1792 | 66304 |     3 |
--------------------------------------------------------------------

Note: cpu costing is off

9 rows selected.

Ok que quiere decir "cpu costing is off", básicamente lo que nos dice es que el motor de base de datos solo está tomando en cuenta para construir el plan de ejecución  las operaciones de I/O (8i) necesarias para completar la tarea.

Que hacer para activarla, bien una forma de hacerlo es la siguiente:

SQL> exec dbms_stats.gather_system_stats('START');

PL/SQL procedure successfully completed.

Esperamos un tiempo para que el motor pueda recolectar la mayor información del sistema posible, y simplemente después hacemos lo siguiente:

SQL> exec dbms_stats.gather_system_stats('STOP');

PL/SQL procedure successfully completed.


Al ejecutar nuevamente la operación inicial obtenemos lo siguiente:


SQL> explain plan for select * from scott.emp2;

Explained.

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
| Id  | Operation                        |  Name       | Rows  | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |                  |  1792 | 66304 |    31  (23)|
|   1 |  TABLE ACCESS FULL   | EMP2        |  1792 | 66304 |    31  (23)|
-------------------------------------------------------------------------

7 rows selected.

El punto a resaltar aquí es el cambio en el costo del plan de ejecución, pasamos de un costo de 3 (sin referencia al CPU) a un costo de 31 (con un 23% de uso del CPU). Si el optimizador dispone de la información de la actividad del sistema donde reside podrá construir planes de ejecución mas ajustados a la realidad.




No hay comentarios: