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 (dameMes(fecha_nac)) funciones predefinidas funciones de usuario Se pueden crear en indices compuestos o Create index I5 on alumnos (upper(apellidos) , dameMes(fecha_nac)) 3 Índices basados en funciones en Oracle Restricciónes ◦ 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 que se esta indexando. ◦ 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 Sintaxis CREATE INDEX [ esquema.]indice ON [esquema.]tabla (column_expression, column_expression, …) ; DROP INDEX [ esquema.]indice; 5 Í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 6 Í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) ); 7