Definición de Índice

8
Definición de índice ¿qué es un índice? ¿para qué sirve? El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla. Al aumentar drásticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se vayan a realizar búsquedas frecuentes. El índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, sólo hay que buscar en el índice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice. Los índices pueden ser creados usando una o más columnas, preparando la base de datos tanto para búsquedas rápidas al azar como para ordenaciones eficientes de los registros. Los índices son construidos sobre árboles B, B+, B* o sobre una mezcla de ellos, funciones de cálculo u otros métodos. El espacio en disco requerido para almacenar el índice es típicamente menor que el espacio de almacenamiento de la tabla (puesto que los índices generalmente contienen solamente los campos clave de acuerdo con los que la tabla será ordenada, y excluyen el resto de los detalles de la tabla), lo que da la posibilidad de almacenar en memoria los índices de tablas que no cabrían en ella. En una base de datos relacional un índice es una copia de parte de una tabla. Cómo crear índices en Oracle Creación de un índice al crear una tabla de Oracle Para crear un índice en la creación de una tabla de Oracle podemos utilizar SQL*Plus (herramienta de línea de comandos incluida con Oracle), se puede utilizar también Oracle Enterprise Manager (modo gráfico) o una aplicación externa que permita acceso a Oracle, como por ejemplo: AjpdSoft Administración Bases de Datos Abriremos esta aplicación e introduciremos los datos para la conexión (nombre de la base de datos, nombre de usuario, contraseña, tipo de acceso): Crearemos una tabla para el ejemplo de creación de índices ejecutando la siguiente consulta SQL : CREATE TABLE facturacion ( codigo number(10) not null, fecha date default sysdate, codigocliente number(10), nombrecliente varchar(100),

description

indice en oracle

Transcript of Definición de Índice

Definición de índice ¿qué es un índice? ¿para qué sirve?

El índice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una tabla. Al aumentar drásticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se vayan a realizar búsquedas frecuentes.

El índice tiene un funcionamiento similar al índice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posición en la base de datos. Para buscar un elemento que esté indexado, sólo hay que buscar en el índice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice.

Los índices pueden ser creados usando una o más columnas, preparando la base de datos tanto para búsquedas rápidas al azar como para ordenaciones eficientes de los registros.

Los índices son construidos sobre árboles B, B+, B* o sobre una mezcla de ellos, funciones de cálculo u otros métodos.

El espacio en disco requerido para almacenar el índice es típicamente menor que el espacio de almacenamiento de la tabla (puesto que los índices generalmente contienen solamente los campos clave de acuerdo con los que la tabla será ordenada, y excluyen el resto de los detalles de la tabla), lo que da la posibilidad de almacenar en memoria los índices de tablas que no cabrían en ella. En una base de datos relacional un índice es una copia de parte de una tabla.

Cómo crear índices en Oracle

Creación de un índice al crear una tabla de Oracle

Para crear un índice en la creación de una tabla de Oracle podemos utilizar SQL*Plus (herramienta de línea de comandos incluida con Oracle), se puede utilizar también Oracle Enterprise Manager (modo gráfico) o una aplicación externa que permita acceso a Oracle, como por ejemplo:

AjpdSoft Administración Bases de Datos

Abriremos esta aplicación e introduciremos los datos para la conexión (nombre de la base de datos, nombre de usuario, contraseña, tipo de acceso):

Crearemos una tabla para el ejemplo de creación de índices ejecutando la siguiente consulta SQL:

CREATE TABLE facturacion (codigo number(10) not null,fecha date default sysdate,codigocliente number(10),nombrecliente varchar(100),observacion varchar(2000),constraint pk_facturacion_codigo primary key (codigo)) tablespace USERS

Como se puede observar en la consulta SQL anterior, al añadir la línea:

constraint pk_facturacion_codigo primary key (codigo)

Estamos indicando a Oracle que cree la tabla "facturacion", con el campo "codigo" y que éste sea clave primaria, por lo que creará un índice automáticamente para este campo. Esta es una forma de crear índices, en la creación de la tabla:

Tras crear la tabla insertaremos algunos registros con la instrucción SQL:

insert into facturacion(codigo, codigocliente, nombrecliente)values (1, 50, 'AjpdSoft')

Puesto que hemos indicado que la columna "codigo" sea clave primaria, Oracle no permitirá valores duplicados para esta columna, esta comprobación la realizará basándose en el índice creado. Si intentamos agregar un nuevo registro con con el valor de "codigo" a "1" (que ya existe) nos mostrará este error:

Con el texto: ORA-00001: restricción única (SYSTEM.PK_FACTURACION_CODIGO) violada, indicando que la restricción únicaPK_FACTURACION_CODIGO no se ha cumplido por lo que no dejará insertar el registro.

Insertaremos varios registros (cambiando el valor de "codigo"). Ejecutando la consulta SQL:

select * from facturacion

Podremos ver los registros insertados en la tabla "facturacion":

Para ver el índice creado se puede utilizar esta consulta.

Crear un índice en una tabla ya existente en Oracle

La creación de un índice en Oracle se realiza mediante el comando create index. Cuando se define una clave primaria o una columna unívoca (UNIQUE) durante la creación de una tabla o su mantenimiento, Oracle creará automáticamente un índice de tipo UNIQUE que gestione dicha restricción, como hemos indicado anteriormente. La sintaxis completa

de create index es la siguiente:

create [bitmap | unique] index nombre_indice on nombre_tabla (nombre_columna [, nombre_columna2] ...) [reverse];

bitmap indica que se cree un índice de mapa de bits que permite crear índices en columnas con muy pocos valores diferentes.

unique indica que el valor de la o las columnas indexadas debe ser único, no puede haber duplicidades.

nombre_indice debe ser un nombre unívoco (no debe existir otro nombre de objeto en Oracle) que siga los convenios de denominación de Oracle para nombrar columnas.

nombre_tabla será el nombre de la tabla donde se creará el índice.

nombre_columna (o columnas) será la columna de la tabla nombre_tabla en la que se creará el índice. Se puede crear un índice para varias columnas.

reverse indica a Oracle que invierta los bytes del valor indexado, lo que puede mejorar la distribución del procesamiento y de los datos cuando se insertan muchos valores de datos secuenciales.

Para crear un índice en Oracle podemos utilizar SQL*Plus (herramienta de línea de comandos incluida con Oracle), se puede utilizar Oracle Enterprise Manager (modo gráfico) o una aplicación externa que permita acceso a Oracle, como por ejemplo:

AjpdSoft Administración Bases de Datos

Abriremos esta aplicación e introduciremos los datos para la conexión (nombre de la base de datos, nombre de usuario, contraseña, tipo de acceso):

Siguiendo con el ejemplo, añadiremos un índice normal para la columna "nombrecliente" de la tabla "facturacion". Para ello ejecutaremos la siguiente consulta SQL:

create index IN_FACTURACION_NOMBRECLIENTE on FACTURACION (NOMBRECLIENTE)

Para ver el índice creado podemos ejecutar la siguiente consulta SQL (como indicamos aquí):

select index_name Nombre, index_type Tipo,table_name Tabla, tablespace_name Tablespace,secondary Secundariofrom all_indexeswhere table_name = 'FACTURACION'

Para añadir un índice de tipo UNIQUE, obligando a que los valores del campo indexado sean unívocos, no se puedan repetir en el campo de la tabla, ejecutaremos la siguiente sentencia SQL:

create unique index IN_FACTURACION_COD_CODCLI_FEon FACTURACION (CODIGOCLIENTE, FECHA)

De esta forma Oracle no permitirá que haya dos registros en la tabla "facturacion" con el mismo valor en los campos "codigocliente" y "fecha", es decir, sólo podrá

añadirse una factura por cliente y por día, un cliente no podrá tener dos facturas en un mismo día. Por ejemplo, si insertamos este registro:

insert into facturacion(codigo, codigocliente, fecha)values (6900, 500, to_date('31/12/2009', 'DD-MM-YYYY'))

Intentaremos insertar un segundo registro con el mismo valor en codigocliente y en fecha:

insert into facturacion(codigo, codigocliente, fecha)values (6910, 500, to_date('31/12/2009', 'DD-MM-YYYY'))

Oracle detectará que se está intentando infringir una restricción única, por lo que mostrará el siguiente mensaje de error y no dejará que se inserte el registro:

Con el texto: ORA-00001: restricción única (SYSTEM.IN_FACTURACION_COD_CODCLI_FE) violada

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=449

ON DELETE CASCADEEl uso de una restricción de integridad referencial es hacer cumplir que cada registro hijo tiene

un padre.SQL> CREATE TABLE DEPT  2    (DEPTNO NUMBER PRIMARY KEY,  3    DNAME VARCHAR2(10)) ;

Table created.

SQL> CREATE TABLE EMP  2    (EMPNO NUMBER PRIMARY KEY,  3    ENAME VARCHAR2(10),  4    DEPTNO NUMBER  5      CONSTRAINT EMP_DEPT_FK  6      REFERENCES DEPT(deptno));

Table created.

SQL> INSERT INTO DEPT(deptno,dname) VALUES  2    (50,'CREDIT');

1 row created.

SQL> INSERT INTO EMP(EMPNO,ENAME,DEPTNO) VALUES  2    (9999,'JOEL',50);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> DELETE DEPT WHERE DEPTNO=50;DELETE DEPT WHERE DEPTNO=50*ERROR at line 1:ORA-02292: integrity constraint (SCOTT.EMP_DEPT_FK) violated - child record found

No puedo borrar este departamento, debido a que el departamento no está

vacía. Afortunadamente 

Vamos a redefinir la restricción con una cláusula DELETE CASCADESQL> alter table emp drop constraint emp_dept_fk;

Table altered.

SQL> alter table emp add constraint emp_dept_fk  2  foreign key (deptno) references dept(deptno)  3  on delete cascade;

Table altered.

SQL> DELETE DEPT WHERE DEPTNO=50;

1 row deleted.

SQL> select * from emp where ename='JOEL';

no rows selected

Observe la línea fila 1 eliminado. Este es el mal  he borrado un departamento, y había

empleados en ella, pero tengo ningún error, sin advertencia y sin retroalimentación acerca de la

DELETE EMP.

En lugar de mejorar la calidad de los datos, la ON DELETE CASCADE restricción de clave externa

aquí filas eliminadas en silencio. Joel será una vez que llamar y preguntar por qué él ha sido

borrado ...

Hay una cláusula de más de la clave externa que establece la columna de la refering a null  SQL> INSERT INTO DEPT(deptno,dname) VALUES  2    (60,'RESTAURANT');

1 row created.

SQL> INSERT INTO EMP(EMPNO,ENAME,DEPTNO) VALUES  2    (9998,'MARC',60);

1 row created.

SQL> alter table emp drop constraint emp_dept_fk;

Table altered.

SQL> alter table emp add constraint emp_dept_fk  2  foreign key (deptno) references dept(deptno)  3  on delete set null;

Table altered.

SQL> DELETE DEPT WHERE DEPTNO=60;

1 row deleted.

SQL> select * from emp where ename='MARC';

     EMPNO ENAME          DEPTNO---------- ---------- ----------      9998 MARC

Marc no tiene departamento, debido a que su departamento ha sido eliminado. Una vez más,

no hay comentarios, sin previo aviso, sin error.

En lugar de mejorar la calidad de los datos, la ON DELETE SET NULL restricción de clave

externa aquí columnas filas en silencio actualizados a NULL. Marc se preguntará por qué no

obtiene invitación a las reuniones de departamento.

¿Qué podría ser peor ???

Dispara por supuesto! Dispara no sólo elimina filas en tablas secundarias, pero los

disparadores también pueden hacer cosas muy extrañas, como la actualización de otra

tabla, el cambio de los valores que están tratando de insertar, outputing un mensaje, etc.

También desencadena están programados por sus compañeros, por lo que debe estar lleno

de bichos 

No te puedes imaginar la cantidad de problemas que son causados por factores

desencadenantes y revelan sólo cuando el rastreo.

Una vez tuve algo así comoSQL> CREATE INDEX I ON T(X);

P07431B processed

http://laurentschneider.com/wordpress/2007/08/on-delete-cascade.html