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:
Publicar un comentario