Vous êtes sur la page 1sur 7

INDICES

Se utilizan para mejorar el rendimiento de las peticiones de datos (consultas).


La estructura básica es la siguiente:
-- =============================================
-- Create index basic template
-- =============================================
USE <database_name, sysname, AdventureWorks>
GO

CREATE INDEX <index_name, sysname, ind_test>


ON <schema_name, sysname, Person>.<table_name, sysname, Address>
(
<column_name1, sysname, PostalCode>
)
GO

Ejercicio.
-- =============================================
-- Database: Exercise
-- =============================================
USE master
GO

-- Drop the database if it already exists


IF EXISTS (
SELECT name
FROM sys.databases
WHERE name = N'Exercise'
)
DROP DATABASE Exercise
GO

CREATE DATABASE Exercise


GO

USE Exercise;
GO

-- =============================================
-- Database: Exercise
-- Table; Employees
-- =============================================
CREATE TABLE Employees
(
EmployeeNumber int NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20),
Username nchar(8) NOT NULL,
DateHired date NULL,
HourlySalary money
);
GO

INSERT INTO Employees


VALUES(62480, N'James', N'Haans', N'jhaans', N'1998-10-25', 28.02),
(35844, N'Gertrude', N'Monay', N'gmonay', N'2006-06-22', 14.36),
(24904, N'Philomène', N'Guillon', N'pguillon', N'2001-10-16',
18.05),
(48049, N'Eddie', N'Monsoon', N'emonsoon', N'08/10/2009',
26.22),
(25805, N'Peter', N'Mukoko', N'pmukoko', N'03-10-2004', 22.48),
(58405, N'Chritian', N'Allen', N'callen', N'06/16/1995', 16.45);
GO

CREATE INDEX IX_Employees


ON Employees(EmployeeNumber);
GO

Ejemplo de índice con más de una columna:

CREATE INDEX IX_Employees


ON Employees(LastName, Username);
GO

Para borrar un índice:


DROP INDEX IndexName ON TableName;

Ejemplo.
USE Exercise;
GO
DROP INDEX IX_Employees ON Employees;
GO

COMPROBANDO LA EXISTENCIA DE ÍNDICES

Como hemos dicho en anteriores ocasiones, los objetos que creamos en una
base de datos deben ser únicos, es decir no puede haber dos objetos con el
mismo nombre, si volvemos a ejecutar la sentencia:

USE Exercise;
GO

CREATE INDEX IX_Employees


ON Employees(EmployeeNumber);
GO

Nos devolverá un error diciéndonos que el índice ya existe, para evitar esto,
T-SQL nos permite comprobar la existencia del índice mediante

IF EXISTS (SELECT name FROM sys.indexes


WHERE name = IndexName)
Do something here
Ejemplo:

USE Exercise;
GO

IF EXISTS (SELECT name FROM sys.indexes


WHERE name = N'IX_Employees')
DROP INDEX IX_Employees
ON Employees
GO
CREATE INDEX IX_Employees
ON Employees(EmployeeNumber);
GO

Hay dos tipos de índices:


1. Índices Agrupados
2. Índices no agrupados

1.Índices agrupados (CLUSTERED)


o Obligan a ordenar los registros en función de las columnas de las
que se compone el índice.
o Sólo se puede definir un índice agrupado por tabla

EJEMPLO DE ÍNDICES AGRUPADOS


-- =============================================
-- Database: Exercise
-- =============================================
USE master
GO

-- Drop the database if it already exists


IF EXISTS(SELECT name
FROM sys.databases
WHERE name = N'Exercise'
)
DROP DATABASE Exercise
GO

CREATE DATABASE Exercise


GO

USE Exercise;
GO

-- =============================================
-- Database: Exercise
-- Table; Employees
-- =============================================
CREATE TABLE Employees
(
EmployeeNumber int NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20),
Username nchar(8) NOT NULL,
DateHired date NULL,
HourlySalary money
);
GO

INSERT INTO Employees


VALUES(62480, N'James', N'Haans', N'jhaans', N'1998-10-25', 28.02),
(35844, N'Gertrude', N'Monay', N'gmonay', N'2006-06-22', 14.36),
(24904, N'Philomène', N'Guillon', N'pguillon', N'2001-10-16',
18.05),
(48049, N'Eddie', N'Monsoon', N'emonsoon', N'08/10/2009',
26.22),
(25805, N'Peter', N'Mukoko', N'pmukoko', N'03-10-2004', 22.48),
(58405, N'Chritian', N'Allen', N'callen', N'06/16/1995', 16.45);
GO

CREATE CLUSTERED INDEX IX_Employees


ON Employees(LastName);
GO

Hay varios aspectos a observar un índice agrupado:

    * Para que sea más fácil de buscar en los registros, ellos (los registros) se
ordenan. Esto hace posible que el motor de base de datos mediante un
enfoque de arriba hacia abajo pueda acceder rápidamente al registro deseado
    * Sin que esto sea una exigencia, cada registro debe ser único (ya hemos
visto cómo cuidar de esto, utilizando las restricciones de comprobación, más
adelante, vamos a ver de nuevo la forma de crear registros únicos)
    * Debe haber un único índice agrupado por tabla. Esto significa que si se
crea otro índice agrupado, el anterior (índice agrupado) se elimina.

2.Índices no agrupados (NON CLUSTERED)


o No imponen ningún tipo de clasificación de los registros.
o Hay un límite de 249 índices por tabla

Creación de un índice no agrupado:


CREATE NONCLUSTERED INDEX IndexName ON Table/View(Column(s))

Ejemplo.
-- =============================================
-- Database: Exercise
-- =============================================
USE master
GO

-- Drop the database if it already exists


IF EXISTS(SELECT name
FROM sys.databases
WHERE name = N'Exercise'
)
DROP DATABASE Exercise
GO
CREATE DATABASE Exercise
GO

USE Exercise;
GO

-- =============================================
-- Database: Exercise
-- Table; Employees
-- =============================================
CREATE TABLE Employees
(
EmployeeNumber int NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20),
Username nchar(8) NOT NULL,
DateHired date NULL,
HourlySalary money
);
GO

INSERT INTO Employees


VALUES(62480, N'James', N'Haans', N'jhaans', N'1998-10-25', 28.02),
(35844, N'Gertrude', N'Monay', N'gmonay', N'2006-06-22', 14.36),
(24904, N'Philomène', N'Guillon', N'pguillon', N'2001-10-16',
18.05),
(48049, N'Eddie', N'Monsoon', N'emonsoon', N'08/10/2009',
26.22),
(25805, N'Peter', N'Mukoko', N'pmukoko', N'03-10-2004', 22.48),
(58405, N'Chritian', N'Allen', N'callen', N'06/16/1995', 16.45);
GO

CREATE NONCLUSTERED INDEX IX_Employees


ON Employees(LastName, FirstName);
GO

Restricciones comunes para los dos tipos de índices:


o Máximo de 16 columnas por índice
o El tamaño máximo de la clave del índice es de 900 bytes

Si no especificamos el tipo de índice (CLUSTERED, NON CLUSTERED), sql


server por defecto lo crea como no agrupados(NON CLUSTERED)

PRACTICAS

USE Ejercicios;

CREATE TABLE Customers (


CustomerID int identity(1, 1) primary key CLUSTERED NOT NULL,
AccountNumber nchar(10) UNIQUE,
FullName nvarchar(50) NOT NULL,
PhoneNumber nvarchar(20),
EmailAddress nvarchar(50),
CONSTRAINT CK_CustomerContact
CHECK ((PhoneNumber IS NOT NULL) OR (EmailAddress IS NOT NULL))
);

-- =============================================
-- Database: Ejercicios
-- Table; Employees
-- =============================================
CREATE TABLE Employees
(
EmployeeNumber int NOT NULL,
LastName nvarchar(20) NOT NULL,
FirstName nvarchar(20),
Username nchar(8) NOT NULL,
DateHired date NULL,
HourlySalary money
);
GO

CREATE UNIQUE CLUSTERED INDEX IX_Employees


ON Employees(EmployeeNumber);
GO

USE Ejercicios;
GO

INSERT INTO Customers(AccountNumber, FullName,


PhoneNumber, EmailAddress)
VALUES(N'395805', N'Ann Zeke', N'301-128-3506', N'azeke@yahoo.jp'),
(N'628475', N'Peter Dokta', N'(202) 050-1629',
N'pdorka1900@hotmail.com'),
(N'860042', N'Joan Summs', N'410-114-6820',
N'jsummons@emailcity.net'),
(N'228648', N'James Roberts',
N'(301) 097-9374', N'jroberts13579@gmail.net')
GO

Comprobando la restricción de UNIQUE

USE Ejercicios;
GO
INSERT INTO Employees(EmployeeNumber, FirstName,
LastName, HourlySalary)
VALUES(92935, N'Joan', N'Hamilton', 22.50)
GO

INSERT INTO Employees(EmployeeNumber, FirstName,


LastName, HourlySalary)
VALUES(22940, N'Peter', N'Malley', 14.25)
GO

INSERT INTO Employees(EmployeeNumber, FirstName,


LastName, HourlySalary)
VALUES(27495, N'Christine', N'Fink', 32.05)
GO
INSERT INTO Employees(EmployeeNumber, FirstName,
LastName, HourlySalary)
VALUES(22940, N'Gertrude', N'Monay', 15.55)
GO
INSERT INTO Employees(EmployeeNumber, FirstName,
LastName, HourlySalary)
VALUES(20285, N'Helene', N'Mukoko', 26.65)
GO

Esto nos devolverá:

1 row(s) affected)

(1 row(s) affected)

(1 row(s) affected)
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in
object 'dbo.Employees' with unique index 'IX_Employees'.
The statement has been terminated.

(1 row(s) affected)

Vous aimerez peut-être aussi