web-dev-qa-db-fra.com

Qu'est-ce que signifie réellement cluster et non cluster?

J'ai une exposition limitée à DB et n'ai utilisé DB qu'en tant que programmeur d'application. Je veux savoir à propos de Clustered et Non clustered indexes. J'ai googlé et ce que j'ai trouvé était:

Un index clusterisé est un type spécial d'index qui réorganise le chemin les enregistrements dans la table sont physiquement stockée. Donc table ne peut avoir que un index clusterisé. Les nœuds feuilles d’un index clusterisé contient les données pages. Un index non clusterisé est un type spécial d'indice dans lequel le L’ordre logique de l’index n’est pas correspondre à l'ordre physique stocké de les lignes sur le disque. Le nœud feuille d'un L'index non clusterisé ne consiste pas en les pages de données. Au lieu de cela, la feuille Les nœuds contiennent des lignes d'index.

Ce que j'ai trouvé dans SO était Quelles sont les différences entre un index clusterisé et un index non clusterisé? .

Quelqu'un peut-il expliquer cela en anglais simple?

897
P.K

Avec un index clusterisé, les lignes sont stockées physiquement sur le disque dans le même ordre que l'index. Par conséquent, il ne peut y avoir qu'un seul index clusterisé.

Avec un index non clusterisé, il existe une seconde liste qui contient des pointeurs sur les lignes physiques. Vous pouvez avoir plusieurs index non clusterisés, bien que chaque nouvel index augmente le temps nécessaire pour écrire de nouveaux enregistrements. 

Il est généralement plus rapide de lire à partir d'un index clusterisé si vous souhaitez récupérer toutes les colonnes. Vous n'êtes pas obligé d'aller d'abord à l'index, puis à la table.

L'écriture dans une table avec un index clusterisé peut être plus lente s'il est nécessaire de réorganiser les données.

902
Shiraz Bhaiji

Un index en cluster signifie que vous indiquez à la base de données de stocker des valeurs proches réellement proches les unes des autres sur le disque. Cela présente l’avantage d’analyser/de récupérer rapidement les enregistrements entrant dans une plage de valeurs d’index en cluster.

Par exemple, vous avez deux tables, Client et Commande:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

Si vous souhaitez récupérer rapidement toutes les commandes d'un client particulier, vous pouvez créer un index clusterisé dans la colonne "CustomerID" de la table Order. De cette manière, les enregistrements avec le même CustomerID seront physiquement stockés les uns à côté des autres sur un disque (en cluster), ce qui accélérera leur extraction.

P.S. L’index de CustomerID n’est évidemment pas unique, vous devez donc ajouter un deuxième champ pour «uniquifier» l’index ou laisser la base de données s’en charger, mais c’est une autre histoire.

En ce qui concerne les index multiples. Vous ne pouvez avoir qu'un seul index clusterisé par table car cela définit la manière dont les données sont physiquement organisées. Si vous souhaitez une analogie, imaginez une grande pièce contenant de nombreuses tables. Vous pouvez soit mettre ces tables pour former plusieurs lignes, soit les rassembler pour former une grande table de conférence, mais pas les deux à la fois. Une table peut avoir d’autres index, ils pointeront ensuite sur les entrées de l’index clusterisé qui à son tour dira enfin où trouver les données réelles.

553
user151323

Dans le stockage orienté ligne SQL Server, les index en cluster et non-cluster sont organisés en arborescence B.

enter image description here

( Source de l'image )

La principale différence entre les index en cluster et les index non en cluster est que le niveau feuille de l'index en cluster est la table. Cela a deux implications.

  1. Les lignes des pages de feuilles d'index en cluster contiennent toujours quelque chose pour chacune des colonnes (non éparses) de la table (la valeur ou un pointeur sur la valeur réelle). 
  2. L'index clusterisé est la copie principale d'une table.

Les index non clusterisés peuvent également faire le point 1 en utilisant la clause INCLUDE (Since SQL Server 2005) pour inclure explicitement toutes les colonnes non clés mais ce sont des représentations secondaires et il existe toujours une autre copie des données (la table elle-même).

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

Les deux index ci-dessus seront presque identiques. Avec les pages d'index de niveau supérieur contenant les valeurs des colonnes de clé A,B et les pages de niveau feuille contenant A,B,C,D

Il ne peut y avoir qu'un seul index clusterisé par table, car les lignes de données eux-mêmes peuvent être triés dans un seul ordre.

La citation ci-dessus des livres en ligne de SQL Server provoque beaucoup de confusion

À mon avis, ce serait beaucoup mieux libellé comme.

Il ne peut y avoir qu'un seul index en cluster par table, car les lignes de niveau feuille de l'index en cluster are sont les lignes de la table. 

La citation en ligne de livres n'est pas incorrecte, mais vous devez préciser que le "tri" des index non clusterisés et en cluster est logique et non physique. Si vous lisez les pages au niveau feuille en suivant la liste chaînée et en lisant les lignes de la page dans l'ordre du tableau de logements, vous lirez les lignes d'index dans un ordre trié, mais physiquement, les pages risquent de ne pas être triées. La croyance répandue selon laquelle avec un index clusterisé, les lignes sont toujours stockées physiquement sur le disque dans le même ordre que l'index key est false. 

Ce serait une implémentation absurde. Par exemple, si une ligne est insérée au milieu d'une table de 4 Go, SQL Server ne doit pas copier 2 Go de données dans le fichier pour libérer de l'espace pour la nouvelle ligne insérée.

Au lieu de cela, une page se divise. Chaque page au niveau feuille des index en cluster et non en cluster a l'adresse (File:Page) de la page suivante et de la page précédente dans l'ordre des clés logiques. Ces pages ne doivent pas nécessairement être contiguës ou en ordre de clé.

par exemple. la chaîne de page liée peut être 1:2000 <-> 1:157 <-> 1:7053

Lorsqu'une division de page se produit, une nouvelle page est allouée à partir de n’importe où dans le groupe de fichiers (d’une étendue mixte, de petites tables ou d’une étendue uniforme non vide appartenant à cet objet ou d’une extension uniforme récemment allouée). Il se peut que cela ne soit même pas dans le même fichier si le groupe de fichiers en contient plus d’un.

La mesure dans laquelle l'ordre logique et la contiguïté diffère de la version physique idéalisée correspond au degré de fragmentation logique. 

Dans une base de données nouvellement créée avec un seul fichier, j'ai exécuté ce qui suit.

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

Puis vérifié la mise en page avec

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

Les résultats étaient partout. La première ligne dans l'ordre des touches (avec la valeur 1 - mise en évidence par la flèche ci-dessous) se trouvait presque à la dernière page physique.

enter image description here

La fragmentation peut être réduite ou supprimée en reconstruisant ou en réorganisant un index pour augmenter la corrélation entre l'ordre logique et l'ordre physique.

Après avoir couru

ALTER INDEX ix ON T REBUILD;

J'ai eu le suivant

enter image description here

Si la table n'a pas d'index clusterisé, cela s'appelle un tas.

Les index non clusterisés peuvent être générés sur un tas ou un index clusterisé. Ils contiennent toujours un localisateur de lignes vers la table de base. Dans le cas d'un segment de mémoire, il s'agit d'un identificateur de ligne physique (débarrasser) composé de trois composants (Fichier: Page: Emplacement). Dans le cas d'un index en cluster, le localisateur de ligne est logique (clé d'index en cluster). 

Dans ce dernier cas, si l'index non clusterisé inclut déjà naturellement la ou les colonnes de clé CI en tant que colonnes de clé NCI ou colonnes INCLUDE-d, rien n'est ajouté. Sinon, la ou les colonnes de clé CI manquantes sont ajoutées au NCI en mode silencieux.

SQL Server s'assure toujours que les colonnes de clé sont uniques pour les deux types d'index. Le mécanisme dans lequel cela est appliqué pour les index non déclarés comme uniques diffère toutefois entre les deux types d'index.

Les index clusterisés reçoivent une uniquifier ajoutée pour toutes les lignes avec des valeurs de clé qui dupliquent une ligne existante. Ceci est juste un entier croissant. 

Pour les index non clusterisés non déclarés comme uniques, SQL Server ajoute en mode silencieux le localisateur de lignes à la clé d'index non clusterisée. Cela s'applique à toutes les lignes, pas seulement à celles qui sont en double.

La nomenclature en cluster vs non en cluster est également utilisée pour les index de magasin de colonnes. Le papier Améliorations apportées aux magasins de colonnes SQL Server states

Bien que les données de magasin de colonnes ne soient pas vraiment "mises en cluster" sur une clé, nous décidé de conserver la convention traditionnelle SQL Server de référence à l'index primaire en tant qu'index clusterisé.

253
Martin Smith

Je me rends compte qu’il s’agit d’une question très ancienne, mais j’ai pensé proposer une analogie pour illustrer les bonnes réponses ci-dessus.

INDEX CLUSTERED

Si vous entrez dans une bibliothèque publique, vous constaterez que les livres sont tous classés dans un ordre particulier (très probablement le système décimal Dewey, ou DDS). Cela correspond au "index clusterisé" des livres. Si le numéro DDS du livre que vous voulez était 005.7565 F736s, commencez par localiser la rangée d'étagères portant le libellé 001-099 ou quelque chose du genre. (Ce signe d'extrémité à la fin de la pile correspond à un "nœud intermédiaire" dans l'index.) Vous accédez ensuite à l'étagère spécifique nommée 005.7450 - 005.7600, puis vous numérisez jusqu'à ce que vous ayez trouvé le livre avec le n ° DDS spécifié et à ce moment vous avez trouvé votre livre.

INDEX NON CLUSTERED

Mais si vous n'entrez pas dans la bibliothèque avec le numéro DDS de votre livre mémorisé, vous aurez alors besoin d'un deuxième index pour vous aider. Autrefois, vous trouviez sur le devant de la bibliothèque un magnifique bureau à tiroirs appelé "Catalogue de cartes". Il contenait des milliers de cartes 3x5 - une pour chaque livre, classées par ordre alphabétique (par titre, peut-être). Cela correspond au "index non clusterisé" . Ces catalogues de cartes étaient organisés selon une structure hiérarchique, de sorte que chaque tiroir soit étiqueté avec la gamme de cartes qu’il contenait (Ka - Kl, par exemple; c’est-à-dire le "noeud intermédiaire"). Encore une fois, vous fouilliez jusqu'à ce que vous trouviez votre livre, mais dans ce cas, une fois que vous l'avez trouvé (c'est-à-dire le "nœud feuille"), vous n'avez pas le livre lui-même, mais juste une carte. avec un numéro index (numéro DDS) avec lequel vous pouvez trouver le livre dans l’index clusterisé.

Bien entendu, rien n'empêcherait le bibliothécaire de photocopier toutes les cartes et de les trier dans un ordre différent dans un catalogue de cartes séparé. (En règle générale, il existait au moins deux catalogues de ce type: l'un trié par nom d'auteur et l'autre par titre.) En principe, vous pouvez avoir autant d'index que vous le souhaitez. 

103
kmote

Vous trouverez ci-dessous certaines caractéristiques des index clusterisés et non clusterisés:

Index clusterisés

  1. Les index clusterisés sont des index qui identifient de manière unique les lignes d'une table SQL.
  2. Chaque table peut avoir exactement un index en cluster.
  3. Vous pouvez créer un index clusterisé couvrant plusieurs colonnes. Par exemple: create Index index_name(col1, col2, col.....).
  4. Par défaut, une colonne avec une clé primaire a déjà un index en cluster.

Index non clusterisés

  1. Les index non-groupés ressemblent à des index simples. Ils sont simplement utilisés pour la récupération rapide des données. Pas sûr d'avoir des données uniques.
66
Anirudh Sood

Une règle empirique très simple et non technique serait que les index clusterisés sont généralement utilisés pour votre clé primaire (ou au moins une colonne unique) et que les index non clusterisés sont utilisés pour d'autres situations (une clé étrangère par exemple) . En effet, SQL Server créera par défaut un index en cluster sur la ou les colonnes de votre clé primaire. Comme vous l'aurez appris, l'index clusterisé se rapporte à la manière dont les données sont physiquement triées sur le disque, ce qui signifie que c'est un bon choix complet dans la plupart des situations.

45
Dan Diplo

Index clusterisé

Un index en cluster détermine l’ordre physique de DATA dans une table. Pour cette raison, une table ne contient qu’un seul index en cluster.

comme "dictionnaire" Pas besoin d'aucun autre Index, c'est déjà Index d'après les mots 

Index non clusterisé

Un index non cluster est analogue à un index dans un livre. Les données sont stockées à un endroit. l'index .__ est stocké à un autre endroit et l'index comporte des pointeurs sur l'emplacement de stockage des données. Pour cette raison, une table a plus d'un index non clusterisé.

comme "livre de chimie" sur regarder il y a un index séparé pour indiquer l'emplacement du chapitre et à la "FIN" il y a un autre index indiquant l'emplacement commun de WORDS 

13
abdul rehman kk

Index clusterisé

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 l'index. Il ne peut y avoir qu'un seul index clusterisé par table, car les lignes de données elles-mêmes peuvent être triées dans un seul ordre.

Le seul moment où les lignes de données d'une table sont stockées dans un ordre trié correspond au moment où la table contient un index en cluster. Lorsqu'une table a un index en cluster, la table 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 non ordonnée appelée tas.

Non clusterisé

Les index non clusterisés ont une structure distincte des lignes de données. Un index non clusterisé contient les valeurs de clé d'index non clusterisées et chaque entrée de clé clé comporte un pointeur sur la ligne de données contenant la valeur clé ..____. La structure du localisateur de lignes varie selon que les pages de données sont stockées dans un tas ou dans 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.

Vous pouvez ajouter des colonnes non-clés au niveau feuille de l'index non clusterisé pour contourner les limites de clé d'index existantes et exécuter des requêtes indexées entièrement couvertes. Pour plus d'informations, voir Créer des index avec des colonnes incluses. Pour plus d'informations sur les limites de clé d'index, voir Spécifications de capacité maximale pour SQL Server.

Référence: https://docs.Microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-déscrit

3
marvelTracker

Index en cluster: La contrainte de clé primaire crée automatiquement un index en cluster si aucun index en cluster n'existe déjà dans la table. Les données réelles de l'index clusterisé peuvent être stockées au niveau feuille de l'index. 

Index non clusterisé: .__ Les données réelles de l'index non clusterisé ne sont pas directement trouvées au noeud feuille, mais doivent plutôt effectuer une étape supplémentaire, car elles ne contiennent que des valeurs de localisateurs de lignes pointant vers les données réelles ..__ Les index non clusterisés ne peuvent pas être triés en index clusterisé. Il peut y avoir plusieurs index non clusterisés par table, cela dépend en fait de la version du serveur SQL que nous utilisons. Sql Server 2005 autorise fondamentalement 249 index non clusterisés et pour les versions ci-dessus telles que 2008 ou 2016, il autorise 999 index non clusterisés par table.

0
Abhishek Duppati

Permettez-moi de vous proposer une définition de manuel sur "l'index de clustering", tirée de 15.6.1 de Base de données - Le système complet :

On peut aussi parler de clustering indexes, qui sont des index sur un attribut ou des attributs tels que tous les n-uplets ayant une valeur fixe pour la clé de recherche de cet index apparaissent sur à peu près aussi peu de blocs que possible.

Pour comprendre la définition, examinons l'exemple 15.10 fourni par le manuel:

Une relation R(a,b) qui est triée sur l'attribut a et stockée dans celui-ci ordre, emballé dans des blocs, est sûrement clusterd. Un index sur a est un indice de clustering, puisque pour une a- valeur a1 donnée, tous les n-uplets avec cette valeur pour a est consécutive. Ils apparaissent donc emballés dans blocs, sauf éventuellement pour les premier et dernier blocs qui contiennent a- valeur a1, comme suggéré dans la Fig.15.14. Cependant, un index sur b est Il est peu probable que la grappe soit en cluster, car les n-uplets ont une valeur b_ fixe sera réparti dans tout le fichier sauf si les valeurs de a et b sont très étroitement liée.

 Fig 15.14

Notez que la définition n'impose pas que les blocs de données doivent être contigus sur le disque; cela signifie seulement que les tuples avec la clé de recherche sont regroupés dans le moins de blocs de données possible.

Un concept connexe est la relation clustered. Une relation est "groupée" si ses n-uplets sont regroupés dans un nombre de blocs aussi grand que possible. En d’autres termes, d’un bloc de disque, si elle contient des n-uplets de relations différentes, ces relations ne peuvent pas être regroupées (c’est-à-dire qu’il existe un moyen plus compact de stocker une telle relation en permutant les n-uplets de cette relation d’autres blocs de disque avec tuples n’appartient pas à la relation dans le bloc de disque actuel). Clairement, R(a,b) dans l'exemple ci-dessus est groupé. 

Pour relier deux concepts ensemble, une relation en cluster peut avoir un index de clustering et un index non clustering. Toutefois, pour une relation non clusterisée, l'index de clustering n'est possible que si l'index est construit au-dessus de la clé primaire de la relation.

"Cluster" en tant que Word est spammé à travers tous les niveaux d'abstraction du côté stockage de la base de données (trois niveaux d'abstraction: tuples, blocs, fichier). Un concept appelé " clustered file ", qui décrit si un fichier (une abstraction pour un groupe de blocs (un ou plusieurs blocs de disque)) contient des n-uplets d'une ou de plusieurs relations. Cela n'a aucun rapport avec le concept d'index de clustering, comme c'est le cas au niveau du fichier.

Cependant, certains matériels didactiques aiment définir un index de clustering en fonction de la définition du fichier en cluster. Ces deux types de définitions sont les mêmes au niveau des relations en cluster, qu’elles définissent une relation en cluster en termes de bloc ou de fichier de disque de données. À partir du lien dans ce paragraphe, 

Un index sur un ou plusieurs attributs A sur un fichier est un index de clustering dans lequel: Tous les nuplets ayant la valeur d'attribut A = a sont stockés séquentiellement (= consécutivement) dans le fichier de données.

Stocker les n-uplets consécutivement revient à dire "les n-uplets sont regroupés dans un nombre de blocs aussi grand que possible" (avec une différence mineure entre un qui parle de fichier, l'autre qui parle de disque). C’est parce que stocker Tuple de manière consécutive est le moyen d’obtenir des résultats «regroupés dans un nombre de blocs aussi réduit que possible».

0
xxks-kkk