Está en la página 1de 12

CREATE INDEX

se utiliza para crear índices en una tabla.

Un índice sirve para buscar datos rápidamente, y no tener que recorrer toda la
tabla secuencialmente en busca alguna fila concreta.

Si una columna es índice de una tabla, al buscar por un valor de esa columna,
iremos directamente a la fila correspondiente. La búsqueda así es mucho más
óptima en recursos y más rápida en tiempo.

Si esa columna de búsqueda no fuese índice, entonces tendríamos que recorrer


de forma secuencial la tabla en busca de algún dato. Por eso, es importante crear
un índice por cada tipo de búsqueda que queramos hacer en la tabla.

Actualizar una tabla con índices tarda más tiempo porque también hay que
actualizar los índices, así que solo se deben poner índices en las columnas por las
que buscamos frecuentemente.

Se pueden crear índices ÚNICOS, es decir, índices que no admiten valores


duplicados.

Sintaxis para SQL CREATE INDEX

CREATE INDEX nombreindice


ON nombretabla (nombrecolumna)

La columna que forma parte de este índice admite valores duplicados en su


columna.

Sintaxis para SQL CREATE UNIQUE INDEX

CREATE UNIQUE INDEX nombreindice


ON nombretabla (nombrecolumna)

La columna que forma parte de este índice NO admite valores duplicados en su


columna, porque es una clave única.

Ejemplos para SQL CREATE INDEX

Creamos la índice 'indicepersonas' sobre la columna 'persona' de la tabla


'personas'

CREATE INDEX indicepersonas


ON personas (persona)
Si queremos crear un índice sobre varias columnas, por ejemplo, apellido1 y
apellido2

CREATE INDEX indice2personas


ON personas(apellido1, apellido2)

Create Index
Los índices nos ayudan a obtener datos de las tablas en forma más rápida.
Utilicemos un ejemplo para ilustrar este punto: Digamos que estamos interesados
en leer en un libro de jardinería acerca de cómo cultivar pimientos. En vez de leer
el libro desde el comienzo hasta que encontremos una sección sobre pimientos,
es mucho más rápido para nosotros ir a la sección índice al final del libro, ubicar
qué páginas contienen la información sobre pimientos, y luego dirigirnos a esas
páginas directamente. Al dirigirnos al índice primero ahorramos tiempo y
seguramente es el método más eficiente para ubicar la información que
necesitamos.

El mismo principio se aplica para la obtención de datos desde una tabla de base
de datos. Sin un índice, el sistema de base de datos lee a través de toda la tabla
(este proceso se denomina “escaneo de tabla”) para localizar la información
deseada. Con el índice correcto en su lugar, el sistema de base de datos puede
entonces primero dirigirse al índice para encontrar de dónde obtener los datos, y
luego dirigirse a dichas ubicaciones para obtener los datos necesarios. Esto es
mucho más rápido.

Por lo tanto, generalmente se recomienda crear índices en tablas. Un índice puede


cubrir una o más columnas. La sintaxis general para la creación de un índice es:

CREATE INDEX "NOMBRE_ÍNDICE" ON "NOMBRE_TABLA"


(NOMBRE_COLUMNA);
Digamos que tenemos la siguiente tabla:

Tabla Customer
Nombre de Columna Tip de Datos
First_Name char(50)
Last_Name char(50)
Address char(50)
City char(50)
Country char(25)
Birth_Date datetime
Si deseamos crear un índice tanto en Ciudad como en País, ingresaríamos,

CREATE INDEX IDX_CUSTOMER_LAST_NAME


ON Customer (Last_Name);
Pour créer un index dans City et Country, il faut saisir

CREATE INDEX IDX_CUSTOMER_LOCATION


ON Customer (City, Country);
No hay una regla estricta respecto de cómo nombrar un índice. El método
generalmente aceptado es colocar un prefijo, tal como “IDX_”, antes del nombre
de un índice para evitar la confusión con otros objetos de la base de datos.
También es una buena idea brindar información sobre qué tabla y columna(s) se
utilizará el índice.

Por favor note que la sintaxis exacta para CREATE INDEX puede ser distinta
según las diferentes bases de datos. Debería consultar con su manual de
referencia de base de datos para obtener la sintaxis precisa.

Utilice la sentencia CREATE INDEX para crear un índice en una o más columnas
de una tabla y, si lo desea, para crear un clúster de la tabla física en el orden del
índice. Esta sección describe algunas de las opciones disponibles cuando crea
índices. Si desea obtener más información sobre la sentencia CREATE INDEX,
consulte el manual IBM Informix Guide to SQL: Syntax.
Suponga que crea la tabla cliente:
CREATE TABLE cliente
(
cust_num SERIAL(101) UNIQUE
fname CHAR(15),
lname CHAR(15),
company CHAR(20),
address1 CHAR(20),
address2 CHAR(20),
city CHAR(15),
state CHAR(2),
zipcode CHAR(5),
phone CHAR(18)
);Copiar
La sentencia siguiente muestra cómo crear un índice en la columna lname de la
tabla cliente:
CREATE INDEX lname_index ON cliente (lname);

Para crear índices empleamos la instrucción "create index".

La sintaxis básica es la siguiente:

create TIPODEINDICE index NOMBREINDICE


on TABLA(CAMPO);
"TIPODEINDICE" indica si es agrupado (clustered) o no agrupado (nonclustered).
Si no especificamos crea uno No agrupado. Independientemente de si es
agrupado o no, también se puede especificar que sea "unique", es decir, no haya
valores repetidos. Si se intenta crear un índice unique para un campo que tiene
valores duplicados, SQL Server no lo permite.
En este ejemplo se crea un índice agrupado único para el campo "codigo" de la
tabla "libros":

create unique clustered index I_libros_codigo


on libros(codigo);
Para identificar los índices fácilmente, podemos agregar un prefijo al nombre del
índice, por ejemplo "I" y luego el nombre de la tabla y/o campo.

En este ejemplo se crea un índice no agrupado para el campo "titulo" de la tabla


"libros":

create nonclustered index I_libros_titulo


on libros(titulo);
Un índice puede tener más de un campo como clave, son índices compuestos.
Los campos de un índice compuesto tienen que ser de la misma tabla (excepto
cuando se crea en una vista - tema que veremos posteriormente).

Creamos un índice compuesto para el campo "autor" y "editorial":

create index I_libros_autoreditorial


on libros(autor,editorial);
SQL Server crea automáticamente índices cuando se establece una restricción
"primary key" o "unique" en una tabla. Al crear una restricción "primary key", si no
se especifica, el índice será agrupado (clustered) a menos que ya exista un índice
agrupado para dicha tabla. Al crear una restricción "unique", si no se especifica, el
índice será no agrupado (non-clustered).

Ahora podemos entender el resultado del procedimiento almacenado


"sp_helpconstraint" cuando en la columna "constraint_type" mostraba el tipo de
índice seguido de las palabras "clustered" o "non_clustered".
Puede especificarse que un índice sea agrupado o no agrupado al agregar estas
restricciones.
Agregamos una restricción "primary key" al campo "codigo" de la tabla "libros"
especificando que cree un índice NO agrupado:

alter table libros


add constraint PK_libros_codigo
primary key nonclustered (codigo);
Para ver los indices de una tabla:

exec sp_helpindex libros;


Muestra el nombre del índice, si es agrupado (o no), primary (o unique) y el campo
por el cual se indexa.

Todos los índices de la base de datos activa se almacenan en la tabla del sistema
"sysindexes", podemos consultar dicha tabla tipeando:

select name from sysindexes;


Para ver todos los índices de la base de datos activa creados por nosotros
podemos tipear la siguiente consulta:

select name from sysindexes


where name like 'I_%';
Servidor de SQL Server instalado en forma local.
Ingresemos el siguiente lote de comandos en el SQL Server Management Studio:

if object_id('libros') is not null


drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(15)
);

go

-- Creamos un índice agrupado único para el campo "codigo" de la tabla "libros":


create unique clustered index I_libros_codigo
on libros(codigo);

-- Creamos un índice no agrupado para el campo "titulo":


create nonclustered index I_libros_titulo
on libros(titulo);

-- Veamos los indices de "libros":


exec sp_helpindex libros;

-- Creamos una restricción "primary key" al campo "codigo" especificando


-- que cree un índice NO agrupado:
alter table libros
add constraint PK_libros_codigo
primary key nonclustered (codigo);

-- Verificamos que creó un índice automáticamente:


exec sp_helpindex libros;

-- Analicemos la información que nos muestra "sp_helpconstraint":


exec sp_helpconstraint libros;

-- Creamos un índice compuesto para el campo "autor" y "editorial":


create index I_libros_autoreditorial
on libros(autor,editorial);

-- Consultamos la tabla "sysindexes":


select name from sysindexes;

-- Veamos los índices de la base de datos activa creados por nosotros


-- podemos tipear la siguiente consulta:
select name from sysindexes
where name like 'I_%';

Uso de diferentes tipos de índices SQL

Índice Único
Un índice único es usado para mantener la integridad de la información de las
columnas sobre las cuales es creado al asegurar que no hay valores duplicados
en el índice clave, y la filas de la tabla, sobre la cual el índice es creado. Esto
aseguro que la información será única basada en el índice clave, dependiendo de
las características de la información que es almacenada en la columna del índice
clave o la lista de columnas. Si el índice Único clave consiste en una columna, el
SQL Server garantizará que cada valor en el índice clave es único. Por otro lado,
el índice Único clave consiste en múltiples columnas, cada combinación de valores
en ese índice clave debería ser único. Puedes definir ambos el índice Agrupado y
No Agrupado para ser único, siempre que la información en esos índices clave
sean únicos.

Un índice Único será creado automáticamente cuando defines una restricción de


CLAVE PRIMARIA o CLAVE UNICA en las columnas específicas. En todos los
casos, crear un índice Único en la información única, en vez de crear un índice no
único en la misma información, es muy recomendable, ya que ayuda al
Optimizador de Consultas SQL Server a generar el plan de ejecución más
eficiente basado en la información adicional útil provista por el índice.

Asume que necesitamos crear la tabla de abajo, usando la declaración CREATE


TABLE T-SQL de abajo, sin especificar ninguna declaración CREATE INDEX,
como se muestra abajo:

CREATE TABLE DiffIndexTypesDemo


( ID INT IDENTITY (1,1) PRIMARY KEY,
Name Varchar(50) CONSTRAINT UQ_Name UNIQUE,
ADDRESS NVARCHAR(MAX)
)
Verás que un índice Único Agrupado será creado automáticamente en la columna
ID de esa tabla, para aplicar la restricción PRIMARY KEY, y un índice Único No
agrupado será creado automáticamente en la columna Nombre para aplicar la
restricción UNIQUE, como se muestra abajo:

Toma en consideración que el índice que es creado automáticamente para aplicar


cualquier restricción no puede ser dejado usando una declaración DROP INDEX
T-SQL. Si tratamos de dejar el índice Único creado previamente para aplicar la
restricción UNIQUE usando la declaración DROP INDEX T-SQL de abajo:

DROP INDEX UQ_Name ON DiffIndexTypesDemo


La declaración fallará, mostrando que no podemos dejar explícitamente ningún
índice que es creado automáticamente para aplicar la restricción, como se
muestra en el mensaje de error de abajo:

Para dejar ese índice, deberíamos dejar la restricción que creó el índice, usando la
declaración ALTER TABLE…DROP CONSTRAINT T-SQL de abajo:
ALTER TABLE DiffIndexTypesDemo DROP CONSTRAINT UQ_Name
El Índice Único puede también ser creado manualmente, fuera de la restricción, al
especificar la palabra clave UNIQUE en la declaración de creación de índice
Agrupado o No Agrupado, como en la declaración CREATE INDEX T-SQL de
abajo:

CREATE UNIQUE NONCLUSTERED INDEX IX_DiffIndexTypesDemo_Name ON


DiffIndexTypesDemo (NAME)
La declaración previa CREATE INDEX, puede ser usada para crear un índice
Único No Agrupado en la columna Nombre, como se muestra abajo:

Un índice Único es usado para aplicar la singularidad de los valores de índice


clave. Por ejemplo, el índice previo es usado para asegurar que ningún valor
duplicado para la columna Nombre este disponible en la tabla. Si tratamos de
ejecutar la declaración INSERT INTO de abajo que inserta dos nuevos registros
con los mismos valores Nombre en la tabla:

INSERT INTO DiffIndexTypesDemo VALUES ('John', 'Amman'),


('John', 'Zarqa')
La declaración fallará, mostrando que no es permitido insertar valores duplicados
para el nombre de la columna, que es aplicada por el índice Único creado,
proveyendo los valores duplicados evitados, como se muestra en el mensaje de
error de abajo:

Si tratamos de dejar el índice Único, usando la declaración INDEX T-SQL de


abajo:

DROP INDEX IX_DiffIndexTypesDemo_Name ON DiffIndexTypesDemo


Luego ejecutas la misma declaración INSERT INTO, verás que los valores
duplicados Nombre serán insertados exitosamente, no teniendo restricción o
índice que aplica la singularidad de los valores de esa columna, como se muestra
claramente abajo:

Ahora, si tratamos de crear el índice Único otra vez en esa tabla, la declaración
CREATE INDEX va a fallar, como la tabla ya ha duplicado valores en la columna
Nombre como se muestra abajo:

Tampoco usando la operación de creación IGNORE_DUP_KEY funcionará con el


índice UNIQUE. Si tratamos de activar esa opción, al crear el índice Único, para
ignorar los valores duplicados existentes, la declaración fallará nuevamente
mostrando que no podemos crear un índice Único con valores de índice clave
duplicados disponibles en la tabla, como se muestra en el mensaje de error de
abajo:
Para ser capaz de crear el índice Único en la columna Nombre, deberíamos borrar
o actualizar los valores duplicados. En nuestro caso, vamos a actualizar el
segundo nombre duplicado usando la declaración UPDATE de abajo:

SELECT * FROM DiffIndexTypesDemo


UPDATE DiffIndexTypesDemo SET Name='Jack' where ID=4
SELECT * FROM DiffIndexTypesDemo
Con las filas de la table antes y después de la operación UPDATE es mostrada
abajo:

Tratando de crear el índice Único después de resolver el problema de duplicado,


el índice Único será creado exitosamente como se muestra abajo:

Podemos incluir otra columna en el índice Único clave, para aplicar la singularidad
de combinación de las dos columnas, a diferencia de aplicarlo solamente en la
columna Nombre. El CREATE INDEX de abajo será usado para crear un índice
único que aplica la singularidad de la combinación de columnas ID y Nombre:

CREATE UNIQUE NONCLUSTERED INDEX IX_DiffIndexTypesDemo_Name ON


DiffIndexTypesDemo (ID,NAME)
Si tratamos de correr la declaración de abajo INSERT INTO, que inserta dos
registros con el mismo nombre, los registros serán insertados exitosamente, ya
que la columna ID es columna IDENTITY que va a asignar diferentes valores por
cada fila insertada de la de abajo:

También podría gustarte