Grandes volúmenes de datos Índices basados en funciones en Oracle bases de datos Índices basados en funciones en Oracle ¿Por qué son necesarias? Si se aplica a un campo indexado alguna función el optimizador puede decidir no utilizar dicho índice. Por ejemplo … where upper(nombre) = ‘PEPE’ … where to_char(fnac,’mm/yyyy’) =‘02/2010’ No usarán los índices aunque existan 2 Índices basados en funciones en Oracle Se pueden crear índices basados en funciones aritméticas ◦ Create index I3 on alumnos (importe+100) ◦ ◦ Create index I1 on alumnos (to_char(feha_nac,’dd/mm/yyyy’)) Create index I2 on alumnos (upper(apellidos)) ◦ Create index I4 on alumnos (dameEdad(fecha_nac)) funciones predefinidas funciones de usuario 3 Índices basados en funciones en Oracle Restricciónes ◦ Tras crear el índice la tabla ha de ser analizada mediante “analyze” o el paquete “dbms_stats” ◦ En el caso de funciones definidas por el usuario deben ser DETERMINISTIC, esto es, debe generar siempre el mismo resultado para una misma entrada (por ejemplo no se puede crear un índice por el numero de asignaturas matriculadas de un estudiante) ◦ No es compatible con columnas LOBs. ◦ Las funciones PL/SQL solo deben hacer referencia a columnas de la fila actual. ◦ No son usados si se unen predicados con OR. ◦ La función ha de ser siempre la misma para que se use el índice Create index I3 on alumnos (importe+100) Select * from alumnos where importe+100 > 200 (usa índice) Select * from alumnos where importe+150 > 250 (NO usa índice) 4 Índices basados en funciones en Oracle Desventajas ◦ Coste temporal adicional En sentencias INSERT y UPDATE se ha de evaluar la función para procesar la sentencia 5 Índices basados en funciones en Oracle Sintaxis CREATE INDEX [ esquema.]indice ON [esquema.]tabla (column_expression, column_expression, …) ; DROP INDEX [ esquema.]indice; 6 Índices basados en funciones en Oracle column_expression ◦ Expecifica una expresión construida de columnas de una tabla, constantes, funciones SQL y funciones definidas por el usuario 7 Índices basados en funciones en Oracle Ejemplos ◦ create index fidx_pedidos_fech_pedi on pedidos (fech_pedi+5); ◦ create index fidx_empresas_cif_empr on empresas (substr(cif_empr,1,1) ); ◦ create index fidx_empresas_nac_empr on empresas (EsNacional(nomb_empr) ); 8