Grandes volúmenes de datos Plan de ejecución bases 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) 2 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 3 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 4 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. Para el resto, indica la posición relativa respecto al padre 5 Plan de ejecución en Oracle Sintaxis (reducida) EXPLAIN PLAN SET STATEMENT_ID = 'texto' INTO esquema.tabla (es la PLAN_TABLE) FOR sentencia ; 6 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 Select, insert, update, delete, create table, ……….. 7 Plan de ejecución en Oracle Ejemplo. No existe índice 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 where statement_id='e1'; 8 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 where statement_id='e2'; 9 Plan de ejecución en Oracle Ejemplo sin indice explain plan set statement_id='bm1' for select nume_pedi, fech_pedi from pedidos where esta_pedi ='R'; 10 Plan de ejecución en Oracle Ejemplo con indice b-tree create index idx_pedidos_esta_pedi on pedidos (esta_pedi); explain plan set statement_id='bm2' for select nume_pedi, fech_pedi from pedidos where esta_pedi ='R'; 11 Plan de ejecución en Oracle Ejemplo con índice bitmap drop index idx_pedidos_esta_pedi; create bitmap index bidx_pedidos_esta_pedi on pedidos (esta_pedi); explain plan set statement_id='bm3' for select nume_pedi, fech_pedi from pedidos where esta_pedi ='R'; 12 Plan de ejecución en Oracle 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'; 13 Plan de ejecución en Oracle Ejemplo. Función aritmética 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'; 14 Plan de ejecución en Oracle Ejemplo. Función aritmética create index fidx_pedidos_fech_pedi on pedidos (fech_pedi+5); No hace falta borrar idx_pedidos_fech_pedi 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'; 15 Plan de ejecución en Oracle Ejemplo. Función aritmética explain plan set statement_id='bf4' for select nume_pedi, esta_pedi from pedidos where fech_pedi +5 > '25/05/07'; 16 Plan de ejecución en Oracle Ejemplo. Función aritmética YA NO LO USA PUES EL INDICE SE CONSTRUYO CON +5 explain plan set statement_id='bf5' for select nume_pedi, esta_pedi from pedidos where fech_pedi +15 > '25/05/07'; 17 Plan de ejecución en Oracle Ejemplo. Función predefinida SQL select nomb_empre from empresas where cif_empre = 'A1234567'; explain plan set statement_id='bf6' for select nomb_empr from empresas where cif_empr = 'A1234567'; 18 Plan de ejecución en Oracle Ejemplo. Función SQL select nomb_empr from empresas where substr(cif_empr,1,1) = 'A'; explain plan set statement_id='bf6' for select nomb_empr from empresas where substr(cif_empr,1,1) = 'A'; 19 Plan de ejecución en Oracle Ejemplo. Función SQL 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; explain plan set statement_id='bf7' for select nomb_empr from empresas where substr(cif_empr,1,1) = 'A'; 20 Plan de ejecución en Oracle Existen utilidades que nos facilitan esta tarea 21 Plan de ejecución en Oracle En muchos casos el plan de ejecución es muy complejo 22