Grandes volúmenes de
datos
Plan de ejecución en Oracle
Plan de ejecución
◦ Es la fase del “parseo” de una sentencia encargada de decidir cómo se va a acceder a los datos solicitados -> se encarga el optimizador.
◦ El optimizador puede trabajar por REGLAS o COSTES (defecto)
◦ En función de si trabaja por REGLAS o COSTES el optimizador debe considerar diversos factores relacionados con los objetos
referenciados y las condiciones especificadas en el query (indices existentes, tamaños de las tablas, histogramas de los datos, num. filas estimadas en la recuperación, etc …)
◦ El resultado es el plan de ejecución (hoja de ruta a seguir para acceder a la información)
Plan de ejecución en Oracle
EXPLAIN PLAN
◦
Permite consultar
el plan de
ejecución
de una
sentencia
Muestra plan de ejecución La sentencia no se ejecuta
Plan de ejecución en Oracle
EXPLAIN PLAN
◦
Inserta una fila por cada paso del plan de
ejecución en una consulta
◦
La tabla en la que se inserte la descripción debe
contener columnas con nombres y tipos de datos
idénticos a la tabla PLAN_TABLE
proporcionada en el script
$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL
Plan de ejecución en Oracle
PLAN_TABLE
◦ http://download.oracle.com/docs/cd/B19306_01/server.102/b14 211/ex_plan.htm#i18300
◦ Statement_id varchar2(30)
Valor opcional para identificar planes de ejecución
◦ Operation varchar2(30)
Nombre de la operación interna realizada
http://download.oracle.com/docs/cd/B19306_01/server.102/b14211
/ex_plan.htm#i23461 ◦ Options varchar2(225)
Detalles sobre la operación
◦ Object_name varchar2(30)
Nombre de la tabla o índice
◦ Position numeric
Para la primera fila indica el coste estimado por el optimizador
para realizar la sentencia.
Plan de ejecución en Oracle
Sintaxis (reducida)
6 EXPLAIN PLAN
SET STATEMENT_ID = 'texto' INTO esquema.tabla (es la PLAN_TABLE)
Plan de ejecución en Oracle
Cláusula
set statement_id
◦ Valor para la columna plan_table.statement_id
para las filas del plan de ejecución
◦ Valor por defecto null
Cláusula
into table
◦ Nombre de la tabla de salida
◦ Valor por defecto plan_table
Cláusula
for
◦ Sentencia para la cual se desea conocer el plan de ejecución
Plan de ejecución en Oracle
Ejemplo. No existe índice
8 explain plan set statement_id = 'e1'
into plan_table
for select nomb_empr from empresas where cpos_empr = '03560';
select operation, options, object_name, position from plan_table
Plan de ejecución en Oracle
Ejemplo. Existe índice
explain plan set statement_id = 'e2' into plan_table
for select nomb_empr from empresas where cif_empr = 'A1234567';
select operation, options, object_name, position from plan_table
Ejemplo sin indice
10 explain plan set statement_id='bm1'
for select nume_pedi, fech_pedi from pedidos
where esta_pedi ='R';
Ejemplo con indice b-tree
explain plan set statement_id='bm2' for select nume_pedi, fech_pedi
from pedidos
where esta_pedi ='R';
create index idx_pedidos_esta_pedi on pedidos (esta_pedi);
Ejemplo con índice bitmap
12 explain plan set statement_id='bm3'
for select nume_pedi, fech_pedi from pedidos
where esta_pedi ='R';
drop index idx_pedidos_esta_pedi;
create bitmap index bidx_pedidos_esta_pedi on pedidos (esta_pedi);
Ejemplo. Función aritmética
select nume_pedi, esta_pedi from pedidos
where fech_pedi +5 = '25/05/07'; explain plan set statement_id='bf1' for select nume_pedi, esta_pedi
from pedidos
where fech_pedi +5 = '25/05/07';
Ejemplo. Función aritmética
14 create index idx_pedidos_fech_pedi on pedidos
(fech_pedi);
explain plan set statement_id='bf2' for select nume_pedi, esta_pedi
from pedidos
where fech_pedi +5 = '25/05/07';
Ejemplo. Función aritmética
create index fidx_pedidos_fech_pedi on pedidos (fech_pedi+5);
analyze table pedidos compute statistics;
analyze index fidx_pedidos_fech_pedi validate structure;
explain plan set statement_id='bf3' for select nume_pedi, esta_pedi
from pedidos
where fech_pedi +5 = '25/05/07';
No hace falta borrar idx_pedidos_fech_pedi
Ejemplo. Función aritmética
16 explain plan set statement_id='bf4'
for select nume_pedi, esta_pedi from pedidos
where fech_pedi +5 > '25/05/07';
Ejemplo. Función aritmética
explain plan set statement_id='bf5' for select nume_pedi, esta_pedi
from pedidos
where fech_pedi +15 > '25/05/07';
YA NO LO USA PUES EL INDICE SE CONSTRUYO CON +5
Plan de ejecución en Oracle
Ejemplo. Función predefinida SQL
18 explain plan set statement_id='bf6'
for select nomb_empr from empresas
where cif_empr = 'A1234567'; select nomb_empre
from empresas
where cif_empre = 'A1234567';
Ejemplo. Función SQL
explain plan set statement_id='bf6' for select nomb_empr
from empresas
where substr(cif_empr,1,1) = 'A'; select nomb_empr
from empresas
where substr(cif_empr,1,1) = 'A';
Ejemplo. Función SQL
20 explain plan set statement_id='bf7'
for select nomb_empr from empresas
where substr(cif_empr,1,1) = 'A';
create index fidx_empresas_cif_empr on empresas (substr(cif_empr,1,1) );
analyze table empresas compute statistics;
analyze index fidx_empresa_cif_empr validate structure;
Existen utilidades que nos facilitan esta tarea
En muchos casos el plan de ejecución es muy complejo
22