sql >> Base de Datos >  >> RDS >> Sqlserver

Cuándo usar índices agrupados o no agrupados en SQL Server

Los índices de la base de datos se utilizan para mejorar la velocidad de las operaciones de la base de datos en una tabla con una gran cantidad de registros. Los índices de bases de datos (tanto los índices agrupados como los índices no agrupados) son bastante similares a los índices de libros en su funcionalidad. Un índice de libros le permite ir directamente a los diferentes temas tratados en el libro. Si desea buscar un tema específico, simplemente vaya al índice, busque el número de página que contiene el tema que está buscando y luego puede ir directamente a esa página. Sin un índice, tendría que buscar en todo el libro.

Los índices de la base de datos funcionan de la misma manera. Sin índices, tendría que buscar en toda la tabla para realizar una operación de base de datos específica. Con los índices, no tiene que escanear todos los registros de la tabla. El índice lo dirige directamente al registro que está buscando, lo que reduce significativamente el tiempo de ejecución de la consulta.

Los índices de SQL Server se pueden dividir en dos tipos principales:

  1. Índices agrupados
  2. Índices no agrupados

En este artículo, veremos qué son los índices agrupados y no agrupados, cómo se crean y cuáles son las principales diferencias entre los dos. También veremos cuándo usar índices agrupados o no agrupados en SQL Server.

Comencemos primero con un índice agrupado.

Índice agrupado

Un índice agrupado es un índice que define el orden físico en el que se almacenan los registros de la tabla en una base de datos. Dado que solo puede haber una forma en que los registros se almacenan físicamente en una tabla de base de datos, solo puede haber un índice agrupado por tabla. De forma predeterminada, se crea un índice agrupado en una columna de clave principal.

Índices agrupados predeterminados

Vamos a crear una tabla ficticia con una columna de clave principal para ver el índice agrupado predeterminado. Ejecute el siguiente script:

CREATE DATABASE Hospital

CREATE TABLE Patients
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
age INT NOT NULL
)

El script anterior crea una base de datos ficticia Hospital. La base de datos tiene 4 columnas:id, nombre, género, edad. La columna de identificación es la columna de clave principal. Cuando se ejecuta el script anterior, se crea automáticamente un índice agrupado en la columna de identificación. Para ver todos los índices en una tabla, puede usar el procedimiento almacenado "sp_helpindex".

USE Hospital
EXECUTE sp_helpindex Patients

Aquí está la salida:

Puede ver el nombre del índice, la descripción y la columna en la que se crea el índice. Si agrega un nuevo registro a la tabla Pacientes, se almacenará en orden ascendente del valor en la columna id. Si el primer registro que inserta en la tabla tiene una identificación de tres, el registro se almacenará en la tercera fila en lugar de la primera fila, ya que el índice agrupado mantiene el orden físico.

Índices agrupados personalizados

Puede crear sus propios índices agrupados. Sin embargo, antes de poder hacerlo, debe crear el índice agrupado existente. Tenemos un índice agrupado debido a la columna de clave principal. Si eliminamos la restricción de clave principal, se eliminará el clúster predeterminado. El siguiente script elimina la restricción de clave principal.

USE Hospital
ALTER TABLE Patients
DROP CONSTRAINT PK__Patients__3213E83F3DFAFAAD
GO

El siguiente script crea un índice personalizado "IX_tblPatient_Age" en la columna de edad de la tabla de pacientes. Debido a este índice, todos los registros de la tabla Pacientes se almacenarán en orden ascendente de edad.


use Hospital
CREATE CLUSTERED INDEX IX_tblPatient_Age
ON Patients(age ASC)

Agreguemos ahora algunos registros ficticios en la tabla Pacientes para ver si realmente se insertan en orden ascendente de edad:

USE Hospital

INSERT INTO Patients

VALUES
(1, 'Sara', 'Female', 34),
(2, 'Jon', 'Male', 20),
(3, 'Mike', 'Male', 54),
(4, 'Ana', 'Female', 10),
(5, 'Nick', 'Female', 29)

En el script anterior, agregamos 5 registros ficticios. Observe los valores de la columna de edad. Tienen valores aleatorios y no están en ningún orden lógico. Sin embargo, dado que hemos creado un índice agrupado, los registros se insertarán en orden ascendente del valor en la columna de edad. Puede verificar esto seleccionando todos los registros de la tabla Pacientes.

SELECT * FROM Patients

Aquí está la salida:

Puede ver que los registros están ordenados en orden ascendente de los valores en la columna de edad.

Índices no agrupados

También se utiliza un índice no agrupado para acelerar las operaciones de búsqueda. A diferencia de un índice agrupado, un índice no agrupado no define físicamente el orden en que se insertan los registros en una tabla. De hecho, un índice no agrupado se almacena en una ubicación separada de la tabla de datos. Un índice no agrupado es como el índice de un libro, que se encuentra separado del contenido principal del libro. Dado que los índices no agrupados se encuentran en una ubicación separada, puede haber varios índices no agrupados por tabla.

Para crear un índice no agrupado, debe usar la declaración "CREATE NONCLUSTERED". El resto de la sintaxis sigue siendo la misma que la sintaxis para crear un índice agrupado. El siguiente script crea un índice no agrupado "IX_tblPatient_Name" que ordena los registros en orden ascendente del nombre.

use Hospital
CREATE NONCLUSTERED INDEX IX_tblPatient_Name
ON Patients(name ASC)

El script anterior creará un índice que contiene los nombres de los pacientes y la dirección de sus registros correspondientes, como se muestra a continuación:

Nombre Dirección de registro
Ana Registrar dirección
Jon Registrar dirección
Mike Registrar dirección
Nick Registrar dirección
Sara Registrar dirección

Aquí, la "Dirección de registro" en cada fila es la referencia a los registros reales de la tabla para los Pacientes con los nombres correspondientes.

Por ejemplo, si desea recuperar la edad y el sexo del paciente llamado "Mike", la base de datos primero buscará "Mick" en el índice no agrupado "IX_tblPatient_Name" y desde el índice no agrupado obtendrá la referencia de registro real. y lo usará para devolver la edad y el sexo reales del paciente llamado "Mike"

Dado que una base de datos tiene que realizar dos búsquedas, primero en el índice no agrupado y luego en la tabla real, los índices no agrupados pueden ser más lentos para las operaciones de búsqueda. Sin embargo, para las operaciones INSERT y UPDATE, los índices no agrupados son más rápidos ya que el orden de los registros solo necesita actualizarse en el índice y no en la tabla real.

Cuándo usar índices agrupados o no agrupados

Ahora que conoce las diferencias entre un índice agrupado y uno no agrupado, veamos los diferentes escenarios para usar cada uno de ellos.

1. Número de índices

Esto es bastante obvio. Si necesita crear varios índices en su base de datos, opte por un índice no agrupado, ya que solo puede haber un índice agrupado.

2. SELECCIONE Operaciones

Si desea seleccionar solo el valor de índice que se usa para crear e indexar, los índices no agrupados son más rápidos. Por ejemplo, si ha creado un índice en la columna "nombre" y desea seleccionar solo el nombre, los índices no agrupados devolverán rápidamente el nombre.

Sin embargo, si desea seleccionar otros valores de columna, como la edad y el sexo, utilizando el índice de nombres, la operación SELECCIONAR será más lenta, ya que primero se buscará el nombre en el índice y luego se usará la referencia al registro de la tabla real para buscar. la edad y el sexo.

Por otro lado, con los índices agrupados, dado que todos los registros ya están ordenados, la operación SELECCIONAR es más rápida si los datos se seleccionan de columnas distintas a la columna con índice agrupado.

3. Operaciones INSERTAR/ACTUALIZAR

Las operaciones INSERTAR y ACTUALIZAR son más rápidas con índices no agrupados, ya que no es necesario ordenar los registros reales cuando se realiza una operación INSERTAR o ACTUALIZAR. Más bien, solo el índice no agrupado necesita actualización.

4. Espacio en disco

Dado que los índices no agrupados se almacenan en una ubicación separada de la tabla original, los índices no agrupados consumen espacio de disco adicional. Si el espacio en disco es un problema, use un índice agrupado.

5. Veredicto final

Como regla general, cada tabla debe tener al menos un índice agrupado preferiblemente en la columna que se usa para SELECCIONAR registros y contiene valores únicos. La columna de clave principal es un candidato ideal para un índice agrupado.

Por otro lado, las columnas que a menudo están involucradas en las consultas INSERTAR y ACTUALIZAR deben tener un índice no agrupado, suponiendo que el espacio en disco no sea una preocupación.