Vous êtes sur la page 1sur 7

Definicin 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 rpido acceso a los registros de una tabla. Al aumentar
drsticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se
vayan a realizar bsquedas frecuentes.
El ndice tiene un funcionamiento similar al ndice de un libro, guardando parejas de elementos:
el elemento que se desea indexar y su posicin en la base de datos. Para buscar un elemento
que est indexado, slo hay que buscar en el ndice de dicho elemento para, una vez
encontrado, devolver el registro que se encuentre en la posicin marcada por el ndice.
Los ndices pueden ser creados usando una o ms columnas, preparando la base de datos tanto
para bsquedas rpidas 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
clculo u otros mtodos.
El espacio en disco requerido para almacenar el ndice es tpicamente 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
cabran en ella. En una base de datos relacional un ndice es una copia de parte de una tabla.
Cmo crear ndices en Oracle
Creacin de un ndice al crear una tabla de Oracle
Para crear un ndice en la creacin de una tabla de Oracle podemos utilizar SQL*Plus
(herramienta de lnea de comandos incluida con Oracle), se puede utilizar tambin Oracle
Enterprise Manager (modo grfico) o una aplicacin externa que permita acceso a Oracle, como
por ejemplo:
AjpdSoft Administracin Bases de Datos
Abriremos esta aplicacin e introduciremos los datos para la conexin (nombre de la base de
datos, nombre de usuario, contrasea, tipo de acceso):

Crearemos una tabla para el ejemplo de creacin 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 aadir la
lnea:
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 automticamente para este campo. Esta es una
forma de crear ndices, en la creacin de la tabla:

Tras crear la tabla insertaremos algunos registros con


la instruccin 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 comprobacin la realizar basndose 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: restriccin nica


(SYSTEM.PK_FACTURACION_CODIGO) violada,
indicando que la restriccin
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 creacin de un ndice en Oracle se realiza
mediante el comando create index. Cuando se
define una clave primaria o una columna unvoca
(UNIQUE) durante la creacin de una tabla o su
mantenimiento, Oracle crear automticamente un ndice de tipo UNIQUE que gestione dicha
restriccin, 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 unvoco (no debe existir otro nombre de objeto en
Oracle) que siga los convenios de denominacin 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
distribucin 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 lnea de comandos
incluida con Oracle), se puede utilizar Oracle Enterprise Manager (modo grfico) o una aplicacin
externa que permita acceso a Oracle, como por ejemplo:
AjpdSoft Administracin Bases de Datos
Abriremos esta aplicacin e introduciremos los datos para la conexin (nombre de la base de
datos, nombre de usuario, contrasea, tipo de acceso):

Siguiendo con el ejemplo, aadiremos 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
table_name Tabla,
Tablespace,
secondary Secundario
from all_indexes
where table_name =

Nombre, index_type Tipo,


tablespace_name

'FACTURACION'

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

create unique index


IN_FACTURACION_COD_CODCLI_FE
on 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, slo podr
aadirse una factura por cliente y por da, un cliente no podr tener dos facturas en un mismo
da. 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 restriccin nica, por lo que mostrar el
siguiente mensaje de error y no dejar que se inserte el registro:

Con el texto: ORA-00001: restriccin nica (SYSTEM.IN_FACTURACION_COD_CODCLI_FE) violada


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

ON DELETE CASCADE
El uso de una restriccin 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


vaca. Afortunadamente
Vamos a redefinir la restriccin con una clusula DELETE CASCADE
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 cascade;
Table altered.
SQL> DELETE DEPT WHERE DEPTNO=50;

1 row deleted.
SQL> select * from emp where ename='JOEL';
no rows selected

Observe la lnea fila 1 eliminado. Este es el mal he borrado un departamento, y haba


empleados en ella, pero tengo ningn error, sin advertencia y sin retroalimentacin acerca de la
DELETE EMP.
En lugar de mejorar la calidad de los datos, la ON DELETE CASCADE restriccin de clave externa
aqu filas eliminadas en silencio. Joel ser una vez que llamar y preguntar por qu l ha sido
borrado ...
Hay una clusula de ms 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 ms,
no hay comentarios, sin previo aviso, sin error.
En lugar de mejorar la calidad de los datos, la ON DELETE SET NULL restriccin de clave
externa aqu columnas filas en silencio actualizados a NULL. Marc se preguntar por qu no
obtiene invitacin a las reuniones de departamento.

Qu podra ser peor ???


Dispara por supuesto! Dispara no slo elimina filas en tablas secundarias, pero los
disparadores tambin pueden hacer cosas muy extraas, como la actualizacin de otra
tabla, el cambio de los valores que estn tratando de insertar, outputing un mensaje, etc.
Tambin desencadena estn programados por sus compaeros, por lo que debe estar lleno
de bichos
No te puedes imaginar la cantidad de problemas que son causados por factores
desencadenantes y revelan slo cuando el rastreo.
Una vez tuve algo as como

SQL> CREATE INDEX I ON T(X);


P07431B processed

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

Vous aimerez peut-être aussi