web-dev-qa-db-fra.com

Quelles sont les différences entre un index clusterisé et un index non clusterisé?

Quelles sont les différences entre un clustered et un non-clustered index?

254
Eric Labashosky

Index clusterisé

  • Un seul par table
  • Plus rapide à lire que non groupée car les données sont physiquement stockées dans l'ordre des index

Index non clusterisé

  • Peut être utilisé plusieurs fois par table
  • Plus rapide pour les opérations d'insertion et de mise à jour qu'un index en cluster

Les deux types d'index amélioreront les performances lors de la sélection de données avec des champs qui utilisent l'index, mais ralentiront les opérations de mise à jour et d'insertion.

En raison du ralentissement de l'insertion et de la mise à jour, les index en cluster doivent être définis sur un champ qui est normalement incrémentiel, c'est-à-dire Id ou Timestamp.

SQL Server utilisera normalement un index uniquement si sa sélectivité est supérieure à 95%.

241
Martynnw

Les index clusterisés ordonnent physiquement les données sur le disque. Cela signifie qu'aucune donnée supplémentaire n'est nécessaire pour l'index, mais qu'il ne peut y avoir qu'un seul index en cluster (évidemment). L'accès aux données à l'aide d'un index clusterisé est le plus rapide.

Tous les autres index doivent être non clusterisés. Un index non clusterisé contient un duplicata des données des colonnes indexées conservées ordonnées avec des pointeurs sur les lignes de données réelles (pointeurs sur l'index clusterisé, le cas échéant). Cela signifie que l'accès aux données via un index non cluster doit passer par une couche supplémentaire d'indirection. Toutefois, si vous sélectionnez uniquement les données disponibles dans les colonnes indexées, vous pouvez les récupérer directement à partir des données d'index dupliquées (c'est pourquoi il est judicieux de sélectionner uniquement les colonnes dont vous avez besoin et de ne pas utiliser *).

69
rslite

Les index clusterisés sont stockés physiquement sur la table. Cela signifie qu'ils sont les plus rapides et que vous ne pouvez avoir qu'un seul index clusterisé par table. 

Les index non clusterisés sont stockés séparément et vous pouvez en avoir autant que vous le souhaitez.

La meilleure option consiste à définir votre index clusterisé sur la colonne unique la plus utilisée, généralement la clé PK. Vous devriez toujours avoir un index clusterisé bien sélectionné dans vos tables, sauf si une raison très convaincante - ne peut en penser à un seul, mais bon, il est peut-être là-bas - pour ne pas le faire, cela revient.

31
Santiago Cepas

Index clusterisé

  1. Il ne peut y avoir qu'un seul index clusterisé pour une table.
  2. Généralement faite sur la clé primaire.
  3. Les noeuds feuille d'un index en cluster contiennent les pages de données.

Index non clusterisé

  1. Il ne peut y avoir que 249 index non clusterisés pour une table (jusqu'à la version 2005 de SQL 2005 prend en charge jusqu'à 999 index non clusterisés).
  2. Habituellement fait sur n'importe quelle touche.
  3. Le nœud feuille d'un index non clusterisé ne comprend pas les pages de données. Au lieu de cela, les nœuds terminaux contiennent des lignes d'index.
25
Jojo

Index clusterisé

  • Un seul index clusterisé peut être présent dans une table
  • Trier les enregistrements et les stocker physiquement en fonction de l'ordre
  • La récupération de données est plus rapide que les index non-cluster
  • Vous n'avez pas besoin d'espace supplémentaire pour stocker la structure logique

Index non clusterisé

  • Il peut y avoir un nombre quelconque d'index non clusterisés dans une table
  • N'affecte pas l'ordre physique. Créer un ordre logique pour les lignes de données et utiliser des pointeurs vers des fichiers de données physiques
  • L'insertion/mise à jour des données est plus rapide que l'index clusterisé
  • Utiliser de l'espace supplémentaire pour stocker la structure logique

Outre ces différences, vous devez savoir que lorsque la table est non clusterisée (lorsque la table ne possède pas d'index clusterisé), les fichiers de données ne sont pas ordonnés et qu'il utilise la structure de données Heap comme structure de données.

20
Lasitha Yapa

Clustered signifie fondamentalement que les données sont dans cet ordre physique dans la table. C'est pourquoi vous ne pouvez en avoir qu'un par table.

Uncluster signifie que c'est "seulement" un ordre logique.

8
Biri

Avantages:

Les index clusterisés conviennent parfaitement aux plages (par exemple, sélectionnez * dans my_table, où my_key entre @min et @max).

Dans certaines conditions, le SGBD n'aura pas à travailler pour trier si vous utilisez une instruction orderby.

Les inconvénients:

Les index clusterisés peuvent ralentir les insertions car les présentations physiques des enregistrements doivent être modifiées au fur et à mesure que les enregistrements sont insérés si les nouvelles clés ne sont pas dans un ordre séquentiel.

6
Giovanni Galbo

Un index clusterisé décrit en fait l'ordre dans lequel les enregistrements sont physiquement stockés sur le disque, d'où la raison pour laquelle vous ne pouvez en avoir qu'un.

Un index non clusterisé définit un ordre logique qui ne correspond pas à l'ordre physique sur le disque.

5
Josh

Un index en cluster est essentiellement une copie triée des données dans les colonnes indexées.

L’avantage principal d’un index clusterisé est que, lorsque votre requête (recherche) localise les données dans l’index, aucun IO supplémentaire n’est nécessaire pour extraire ces données.

La surcharge liée à la maintenance d'un index clusterisé, en particulier dans une table fréquemment mise à jour, peut entraîner des performances médiocres. Pour cette raison, il peut être préférable de créer un index non clusterisé.

5
Ed Guiness

Une base de données indexée comprend deux parties: un ensemble d'enregistrements physiques, classés dans un ordre arbitraire, et un ensemble d'index identifiant la séquence dans laquelle les enregistrements doivent être lus pour obtenir un résultat trié par un critère. S'il n'y a pas de corrélation entre l'agencement physique et l'index, la lecture de tous les enregistrements dans l'ordre peut nécessiter l'exécution d'un grand nombre d'opérations de lecture indépendantes sur un enregistrement. Puisqu'une base de données peut lire des dizaines d'enregistrements consécutifs en moins de temps qu'il n'en faudrait pour lire deux enregistrements non consécutifs, les performances peuvent être améliorées si les enregistrements consécutifs dans l'index sont également stockés de manière consécutive sur le disque. Si vous indiquez qu'un index est en cluster, la base de données fera des efforts (différentes en fonction de la quantité) pour organiser les choses de manière à ce que les groupes d'enregistrements consécutifs dans l'index le soient sur le disque.

Par exemple, si l’on commençait par une base de données vide non clusterisée et que l’on ajoutait 10 000 enregistrements de manière aléatoire, les enregistrements seraient probablement ajoutés à la fin, dans l’ordre dans lequel ils avaient été ajoutés. La lecture de la base de données dans l'ordre de l'index nécessiterait 10 000 lectures en un enregistrement. Cependant, si l’on utilisait une base de données en cluster, le système pourrait vérifier lors de l’ajout de chaque enregistrement si l’enregistrement précédent était stocké seul; Si tel est le cas, il peut écrire cet enregistrement avec le nouveau à la fin de la base de données. Il pourrait alors examiner l'enregistrement physique avant les emplacements où se trouvaient les enregistrements déplacés et voir si l'enregistrement suivant était stocké par lui-même. Si tel était le cas, il pourrait déplacer cet enregistrement à cet endroit. En utilisant ce type d’approche, de nombreux enregistrements seraient regroupés par paires, doublant ainsi potentiellement la vitesse de lecture séquentielle.

En réalité, les bases de données en cluster utilisent des algorithmes plus sophistiqués que cela. Un élément clé à noter, cependant, est qu'il existe un compromis entre le temps requis pour mettre à jour la base de données et le temps nécessaire pour le lire de manière séquentielle. Le maintien d'une base de données en cluster augmentera considérablement la quantité de travail nécessaire pour ajouter, supprimer ou mettre à jour des enregistrements de manière à affecter la séquence de tri. Si la base de données doit être lue séquentiellement beaucoup plus souvent que mise à jour, la mise en cluster peut être un avantage considérable. Si elle est mise à jour souvent, mais rarement lue dans l’ordre, la mise en cluster peut être une lourde perte de performances, en particulier si l’ordre dans lequel les éléments sont ajoutés à la base de données est indépendant de leur ordre de tri en ce qui concerne l’index cluster.

5
supercat

Vous avez peut-être traversé la partie théorique des articles ci-dessus:

-L'index clusterisé comme on peut voir des points directement à enregistrer, c'est-à-dire son direct, ce qui prend moins de temps pour une recherche. De plus, il ne faudra pas de mémoire/espace supplémentaire pour stocker l'index

-Bien que dans Index non clusterisé, il pointe indirectement sur l'index clusterisé puis il accédera à l'enregistrement réel. En raison de sa nature indirecte, il lui faudra plus de temps pour y accéder.Il faut également disposer de sa propre mémoire/espace stocker l'index

 enter image description here

0
Nandkishor Nangre

// Copié à partir de MSDN, le deuxième point de l'index non clusterisé n'est pas clairement mentionné dans les autres réponses. 

Clustered

  • Les index clusterisés trient et stockent les lignes de données dans la table ou la vue En fonction de leurs valeurs de clé. Ce sont les colonnes incluses dans la définition de Index. Il ne peut y avoir qu'un seul index clusterisé par table, .__, car les lignes de données elles-mêmes ne peuvent être stockées que dans un seul ordre.
  • Le seul moment où les lignes de données d'une table sont stockées dans un ordre trié est Lorsque la table contient un index clusterisé. Lorsqu'une table a un index cluster , Elle est appelée une table en cluster. Si une table N'a pas d'index clusterisé, ses lignes de données sont stockées dans une structure .ordonnée. Non appelée appelée segment de mémoire.

Non clusterisé

  • Les index non clusterisés ont une structure distincte des lignes de données. Un index .clus. Non clusterisé contient les valeurs de la clé d’indexation non clusterisée et
    chaque entrée de valeur de clé a un pointeur sur la ligne de données qui contient la valeur de clé
  • Le pointeur d'une ligne d'index d'un index non clusterisé sur une ligne de données.__ est appelé un localisateur de ligne. La structure du localisateur de lignes dépend de Si les pages de données sont stockées dans un segment de mémoire ou une table en cluster . Pour un segment de mémoire, un localisateur de ligne est un pointeur sur la ligne. Pour une table En cluster, le localisateur de ligne est la clé d'index en cluster.
0
Deepak Mishra