SQL - Index non clusteré

Bonjour, les passionnés de SQL en herbe ! Aujourd'hui, nous plongeons dans l'univers passionnant des indexes non clusterés. Ne vous inquiétez pas si vous êtes nouveau dans la programmation ; je vais vous guider pas à pas à travers ce concept, tout comme j'ai fait pour des centaines d'étudiants au fil des ans. Alors, prenez une tasse de café et partons ensemble dans cette aventure d'apprentissage !

SQL - Non-Clustered Index

Qu'est-ce qu'un index non clusteré ?

Imaginez que vous êtes dans une bibliothèque (oui, celles-ci existent encore !). Les livres sont rangés sur des étagères dans un ordre spécifique - c'est similaire à la façon dont les données sont stockées dans une table. Maintenant, pensez aux fiches d'index dans le catalogue de la bibliothèque. Ces fiches ne changent pas l'ordre des livres, mais elles offrent un moyen rapide de trouver le livre que vous souhaitez. C'est exactement ce que fait un index non clusteré dans SQL !

Un index non clusteré est une structure distincte des lignes de données qui offre une manière efficace de rechercher des données en fonction des colonnes indexées. Il ne change pas l'ordre physique des données dans la table mais crée une liste distincte qui pointe vers les données.

Caractéristiques clés des indexes non clusterés :

  1. Séparé des données : Contrairement aux indexes clusterés, les indexes non clusterés ne déterminent pas l'ordre physique des données dans la table.
  2. Multiples indexes : Vous pouvez avoir plusieurs indexes non clusterés sur une seule table.
  3. Queries plus rapides : Ils peuvent significativement accélérer la récupération des données pour des requêtes spécifiques.
  4. Stockage supplémentaire : Ils nécessitent un espace de stockage supplémentaire car ils sont séparés des données de la table.

Création d'un index non clusteré de base

Commençons par un exemple simple. Supposons que nous avons une table appelée Employees :

CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Email VARCHAR(100),
Department VARCHAR(50)
);

Maintenant, disons que nous cherchons souvent des employés par leur nom de famille. Nous pouvons créer un index non clusteré sur la colonne LastName :

CREATE NONCLUSTERED INDEX IX_Employees_LastName
ON Employees (LastName);

Voici ce que fait ce code :

  • CREATE NONCLUSTERED INDEX : Cela indique à SQL Server que nous voulons créer un index non clusteré.
  • IX_Employees_LastName : C'est le nom que nous donnons à notre index. Il est bon de utiliser une convention de nommage qui inclut le nom de la table et la colonne(s) indexée(s).
  • ON Employees (LastName) : Cela spécifie quelle table et colonne(s) nous indexons.

Après avoir créé cet index, les requêtes qui cherchent par LastName seront généralement beaucoup plus rapides !

Les indexes non clusterés en action

Voyons comment notre nouvel index affecte les performances des requêtes. Imaginons que nous voulons trouver tous les employés dont le nom de famille est "Smith" :

SELECT * FROM Employees WHERE LastName = 'Smith';

Avant de créer l'index, SQL Server aurait dû scanner toute la table pour trouver les lignes correspondantes. Mais maintenant, avec notre index non clusteré, il peut rapidement localiser les lignes pertinentes en utilisant l'index, puis récupérer les données complètes des lignes. C'est comme utiliser le catalogue de la bibliothèque pour trouver un livre au lieu de parcourir chaque étagère !

Création d'un index non clusteré sur plusieurs colonnes

Parfois, nous pouvons vouloir indexer plusieurs colonnes. Par exemple, si nous cherchons souvent des employés par LastName et FirstName, nous pouvons créer un index composite non clusteré :

CREATE NONCLUSTERED INDEX IX_Employees_LastName_FirstName
ON Employees (LastName, FirstName);

Cet index sera particulièrement utile pour des requêtes comme :

SELECT * FROM Employees WHERE LastName = 'Smith' AND FirstName = 'John';

L'ordre des colonnes dans un index composite est important. Dans ce cas, l'index sera le plus efficace pour les requêtes qui filtrent sur LastName, ou sur LastName et FirstName. Il ne sera pas aussi utile pour les requêtes qui filtrent uniquement sur FirstName.

Un mot de prudence

Bien que les indexes puissent grandement améliorer les performances des requêtes, ils ne sont pas une solution "créer et oublier". Chaque index nécessite un stockage supplémentaire et peut ralentir les modifications des données (insertions, mises à jour et suppressions). Il s'agit de trouver un équilibre - comme essayer de maintenir un bureau organisé sans passer toute la journée à le ranger !

Concepts avancés d'indexes non clusterés

Maintenant que nous avons couvert les bases, explorons quelques concepts plus avancés :

Colonnes incluses

Parfois, nous voulons indexer une colonne mais aussi inclure des colonnes supplémentaires dans l'index sans les rendre partie de la clé. Nous pouvons faire cela avec INCLUDE :

CREATE NONCLUSTERED INDEX IX_Employees_LastName_Include_Email
ON Employees (LastName)
INCLUDE (Email);

Cela peut être super utile lorsque vous exécutez souvent des requêtes comme :

SELECT LastName, Email FROM Employees WHERE LastName = 'Smith';

La requête peut être satisfaite entièrement à partir de l'index sans avoir à rechercher les lignes de données réelles !

Index filtrés

Les indexes filtrés sont des indexes partiels qui couvrent uniquement un sous-ensemble des données dans une table. Ils sont parfaits pour les tables où vous recherchez souvent un sous-ensemble spécifique de données :

CREATE NONCLUSTERED INDEX IX_Employees_IT_Department
ON Employees (EmployeeID, LastName)
WHERE Department = 'IT';

Cet index inclura uniquement les employés du département IT, rendant les requêtes pour les employés IT extrêmement rapides !

Meilleures pratiques pour les indexes non clusterés

Voici un tableau résumant quelques meilleures pratiques pour l'utilisation des indexes non clusterés :

Meilleure Pratique Description
Indexer des colonnes sélectives Les colonnes avec de nombreuses valeurs uniques sont de bons candidats pour l'indexation
Considérer les motifs de requêtes Créer des indexes qui soutiennent vos requêtes les plus courantes et importantes
Éviter le sur-indexage trop d'indexes peuvent ralentir les modifications des données
Maintenir les indexes Régulièrement reconstruire ou réorganiser les indexes pour les garder efficaces
Utiliser des indexes couvrants Inclure des colonnes dans l'index pour éviter les recherches de table lorsque possible
Surveiller l'utilisation des indexes Régulièrement vérifier quels indexes sont utilisés et quels ne le sont pas

Souvenez-vous, créer des indexes efficaces est partly science, partly art. Il faut de la pratique et de l'expérience pour le faire correctement !

Conclusion

Et voilà, les amis ! Nous avons parcouru le territoire des indexes non clusterés, des bases aux concepts plus avancés. Ces outils puissants peuvent considérablement accélérer vos requêtes lorsque utilisés avec sagesse.

Alors que vous continuez votre aventure SQL, souvenez-vous que les indexes sont comme les épices dans la cuisine - utilisez-les avec discernement pour améliorer les performances de votre base de données, mais ne les abusez pas !

Continuez à pratiquer, restez curieux, et avant que vous ne vous en rendiez compte, vous serez un maître de l'indexation SQL. Bon codage !

Credits: Image by storyset