Que signifie L'indice groupé et L'indice Non groupé?

j'ai une exposition limitée à DB et n'ai utilisé que DB comme programmeur d'application. Je veux savoir pour Clustered et Non clustered indexes . J'ai cherché sur Google et j'ai trouvé:

un indice groupé est un type spécial d'indice qui réordonne la voie les enregistrements dans le tableau sont physiques stocker. Par conséquent, la table ne peut avoir que un index cluster. Les noeuds foliaires d'un indice groupé contiennent les données page. Un indice non corrigé est un type spécial d'indice dans lequel le l'ordre logique de l'index n' correspondent à l'ordre physique stocké de les lignes sur le disque. Le noeud de la feuille d'un index non-cluster ne consiste pas à les pages de données. Au lieu de cela, la feuille les noeuds contiennent des lignes d'index.

ce que j'ai trouvé dans SO était quelles sont les différences entre un indice groupé et un indice non groupé? .

quelqu'un Peut-il expliquer cela la plaine de l'anglais?

837
demandé sur DineshDB 2009-08-09 19:59:41
la source

9 ответов

avec un index groupé 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 indice groupé.

avec un index non groupé il y a une deuxième liste qui a des pointeurs vers les lignes physiques. Vous pouvez avoir beaucoup d'index non groupés, bien que chaque nouvel index augmente le temps qu'il faut pour écrire de nouveaux enregistrements.

il est généralement plus rapide de lire à partir d'un indice groupé si vous voulez obtenir toutes les colonnes. Vous n'avez pas à aller d'abord à l'index, puis à la table.

Ecrire à une table avec un indice groupé peut être plus lent, s'il ya un besoin de réarranger les données.

831
répondu Shiraz Bhaiji 2016-07-06 22:34:12
la source

un index groupé signifie que vous dites à la base de données de stocker des valeurs de fermeture réellement proches les uns des autres sur le disque. Cela présente l'avantage d'un balayage et d'une récupération rapides des enregistrements se situant dans une certaine gamme de valeurs d'indice groupées.

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 groupé sur le " CustomerID" colonne de la table des ordres. De cette façon, les enregistrements avec le même CustomerID seront physiquement stockés à proximité les uns des autres sur le disque (groupé) Ce qui accélère leur récupération.

P.S. l'index sur CustomerID ne sera évidemment pas unique, donc vous devez soit ajouter un second champ pour "uniquify" l'index ou laisser la base de données gérer cela pour vous, mais c'est une autre histoire.

concernant les indices multiples. Vous ne pouvez avoir qu'un seul index par table parce que cela définit comment les données sont physiquement organisées. Si vous voulez une analogie, imaginez une grande salle avec de nombreux tableaux. Vous pouvez mettre ces tableaux pour former plusieurs rangées ou les rassembler pour former une grande table de conférence, mais pas les deux à la fois. Une table peut avoir d'autres indices, puis pointez sur les entrées de l'index cluster, qui à son tour va enfin dire où trouver les données réelles.

536
répondu csano 2011-08-26 02:14:51
la source

en SQL Server row oriented storage les index groupés et non-groupés sont organisés en arbres B.

enter image description here

( Image Source )

la principale différence entre les indices groupés et les indices non groupés est que le niveau foliaire de l'indice groupé est le tableau. Cela a deux conséquences.

  1. les lignes sur les pages de feuilles d'index groupées contiennent toujours quelque chose pour chacune des colonnes (non éparses) dans le tableau (soit la valeur, ou un pointeur vers la valeur réelle).
  2. l'index groupé est la copie primaire d'un tableau.

les index non-clustered peuvent aussi faire le point 1 en utilisant la clause INCLUDE (depuis SQL Server 2005) pour inclure explicitement toutes les colonnes non-clés mais elles sont des représentations secondaires et il y a toujours une autre copie des données autour (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 indices ci-dessus seront presque identiques. Avec les pages d'index de niveau supérieur contenant les valeurs pour les colonnes clés A,B et les pages de niveau de feuille contenant A,B,C,D

il ne peut y avoir qu'un seul indice par table, parce que les lignes de données ils peuvent être triés en un seul ordre.

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

À mon avis, il serait beaucoup mieux rédigé comme.

il ne peut y avoir qu'un seul indice groupé par tableau, parce que les rangées à l'échelle de la feuille de l'indice groupé sont les rangées du tableau.

la citation de livres en ligne n'est pas incorrecte, mais vous devez être clair que le " tri " des indices groupés et non groupés est logique et non physique. Si vous lisez les pages au niveau de la feuille en suivant la liste liée et lisez les lignes sur la page dans l'ordre de tableau de fente alors vous lirez les lignes d'index dans l'ordre trié mais physiquement les pages peuvent ne pas être triées. L'idée communément admise qu'avec un index cluster les lignes sont toujours stockées physiquement sur le disque dans le même ordre que l'indice clé est faux.

Ce serait une mise en œuvre absurde. Par exemple, si une ligne est insérée au milieu d'un serveur de table SQL de 4 Go, et non doit copier 2 Go de données dans le fichier pour faire place à la ligne nouvellement insérée .

au lieu de cela, une Division de page se produit. Chaque page au niveau de la feuille des index groupés et non groupés a l'adresse ( File:Page ) de la page suivante et de la page précédente dans l'ordre logique des clés. Il n'est pas nécessaire que ces pages soient contiguës ou l'ordre des clés.

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

Lorsqu'il se produit une scission de page, une nouvelle page est attribuée à partir de n'importe quel point du groupe de fichiers (soit à partir d'une extension mixte, pour les petites tables, soit à partir d'une extension uniforme non vide appartenant à cet objet, soit à partir d'une extension uniforme nouvellement attribuée). Ce pourrait même ne pas être dans le même fichier si le fichier de groupe contient plus d'un.

Le degré auquel l'ordre logique et la contiguïté diffère de la version physique idéalisée est le 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 de la clé (avec la valeur 1 - surlignée avec la flèche ci-dessous) était sur 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 indice 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 la suivante

enter image description here

si la table n'a pas d'index groupé, elle est appelée un tas.

Non les index groupés peuvent être construits sur un tas ou un index groupé. Ils contiennent toujours un localisateur de ligne dans la table de base. Dans le cas d'un tas, il s'agit d'un identificateur de ligne physique (rid) et se compose de trois composants (Fichier:Page:fente). Dans le cas d'un indice groupé, Le Localisateur de ligne est logique (la clé de l'indice groupé).

pour ce dernier cas si l'indice non groupé inclut déjà naturellement la ou les colonnes clés CI soit en tant que colonnes clés NCI, soit INCLUDE - d colonnes, alors que rien n'est ajouté. Dans le cas contraire, la ou les colonnes manquantes sont ajoutées silencieusement au NCI.

SQL Server garantit toujours que les colonnes clés sont uniques pour les deux types d'index. Le mécanisme qui est appliquée pour les index non déclarées comme unique diffère entre les deux types d'index.

les index groupés obtiennent un uniquifier ajouté pour toutes les lignes avec des valeurs clés qui dupliquent une ligne existante. C'est juste un croissant entier.

pour les index non groupés non déclarés comme serveur SQL unique ajoute silencieusement le Localisateur de ligne à la touche index non groupés. Cela s'applique à toutes les lignes, pas seulement celles qui sont en fait des doublons.

la nomenclature clustered vs non clustered est également utilisée pour les index de magasin de colonne. Le papier améliorations à la colonne SQL Server États

bien que colonne les données de stockage ne sont pas vraiment "groupées" sur n'importe quelle clé, nous décidé de conserver la traditionnelle Convention SQL Server de référence à l'indice primaire en tant qu'indice groupé.

228
répondu Martin Smith 2018-01-07 17:43:52
la source

je sais, c'est une très vieille question, mais j'ai pensé que je voudrais proposer une analogie pour illustrer l'amende réponses ci-dessus.

CLUSTERED INDEX

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 de Dewey, ou DDS). Cela correspond à la "index cluster" des livres. Si le DDS# pour le livre que vous voulez était 005.7565 F736s , vous commencerait par localiser la rangée de étagères qui est étiqueté 001-099 ou quelque chose comme ça. (Ce bouchon signe à la fin de la pile correspond à un "intermédiaire nœud" dans l'index.) Éventuellement, vous iriez jusqu'à l'étagère spécifique étiquetée 005.7450 - 005.7600 , puis vous scanneriez jusqu'à ce que vous trouviez le livre avec le numéro DDS spécifié, et à ce point vous avez trouvé votre livre.

NON-CLUSTERED INDEX

mais si vous n'êtes pas venu dans la bibliothèque avec le DDS# de votre livre mémorisé, alors vous auriez besoin d'un deuxième indice pour vous aider. Dans les temps anciens que vous trouverez à l'avant de la bibliothèque, un magnifique bureau à tiroirs connu comme le "Catalogue". Il y avait des milliers de cartes 3x5 -- une pour chaque Livre, trié dans l'ordre alphabétique (par titre, peut-être). Cela correspond à la "index non-cluster" . Ces catalogues ont été organisés dans une structure hiérarchique, de sorte que chaque tiroir serait étiqueté avec la gamme de cartes qu'il contenait ( Ka - Kl , par exemple; c.-à-d., le "noeud intermédiaire"). Une fois de plus, vous devriez forer jusqu'à ce que vous trouviez votre livre, mais dans cette affaire , une fois que vous l'avez trouvé (I. e, le "noeud de feuille"), vous n'avez pas le livre lui-même, mais juste une carte avec un index nombre (le DDS#) avec lequel vous pourriez trouver le livre réel dans l'index groupé.

bien sûr, rien ne pourrait arrêtez 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 général, il y avait au moins deux catalogues de ce genre: un classé par nom d'auteur et l'autre par titre. En principe, vous pouvez avoir autant de ces index "non-groupés" que vous voulez.

84
répondu kmote 2016-11-03 20:43:46
la source

trouver ci-dessous quelques caractéristiques des indices groupés et non groupés:

Index Cluster

  1. les index groupés sont des index qui identifient uniquement les lignes dans une table SQL.
  2. chaque table peut avoir exactement un index groupé.
  3. vous pouvez créer un index groupé qui couvre plus d'une colonne. Par exemple: create Index index_name(col1, col2, col.....) .
  4. Par défaut, une colonne avec une clé primaire a déjà un index cluster.

Indexes Non-clustered

  1. les indices non groupés sont comme des indices simples. Ils sont simplement utilisés pour la récupération rapide des données. Pas sûr d'avoir des données uniques.
63
répondu Anirudh Sood 2013-07-10 04:22:19
la source

une règle empirique très simple et non technique serait que les index groupés sont généralement utilisés pour votre clé primaire (ou, au moins, une colonne unique) et que les non-groupés sont utilisés pour d'autres situations (peut-être une clé étrangère). En effet, SQL Server va par défaut créer un index groupé sur votre(vos) colonne (s) clé (s) primaire (s). Comme vous l'aurez appris, l'index groupé se rapporte à la façon dont les données sont triées physiquement sur le disque, ce qui signifie que c'est un bon choix pour la plupart des situations.

43
répondu Dan Diplo 2009-08-09 20:17:21
la source

Index Cluster

un indice groupé détermine l'ordre physique des données dans un tableau.Pour cette raison, un tableau n'a qu'un indice groupé.

comme "dictionnaire" Pas besoin de tout autre Indice, c'est déjà l'Indice selon les mots

Indice Non Consolidé

non index cluster est analogue à un index dans un Livre.Les données sont stocker dans une lieu. le l'indice de magasin dans un autre lieu et de l'indice des pointeurs vers l'emplacement de stockage des données.Pour cette raison, un tableau a plus de 1 Indice non corrigé.

comme "Livre de chimie" à staring il y a un index séparé pour l'emplacement du chapitre de point et à la "fin" il y a un autre Index pointant les mots communs emplacement

5
répondu abdul rehman kk 2018-01-21 21:47:09
la source

Index Cluster

les index groupés trient et stockent les lignes de données dans le tableau ou la vue en fonction de leurs valeurs clés. Ce sont les colonnes incluses dans la définition de l'index. Il ne peut y avoir qu'un seul index par table, parce que 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 dans une table sont stockées dans l'ordre trié est lorsque la table contient un index groupé. Lorsqu'un la table a un index groupé, la table est appelée une table groupée. Si une table n'a pas d'index groupé, ses lignes de données sont stockées dans une structure non ordonnée appelée un tas.

non compris

les indices non classés ont une structure séparée des lignes de données. Un indice non corrigé contient les valeurs clés de l'indice non corrigé et chaque entrée de valeur clé a un pointeur vers la ligne de données qui contient la valeur clé. Le pointeur à partir d'un l'indice de ligne dans un index non cluster pour une ligne de données est appelé un localisateur de ligne. La structure du Localisateur de ligne dépend de si les pages de données sont stockées dans un tas ou une table groupée. Pour un segment, un localisateur de ligne est un pointeur vers la ligne. Pour une table en grappes, le Localisateur de ligne est la clé d'index en grappes.

vous pouvez ajouter des colonnes nonkey au niveau de feuille de l'index non-clustered pour contourner les limites de clé existantes de l'index, et exécuter des requêtes entièrement couvertes, indexées. Pour plus d' d'informations, voir Créer des Index avec des Colonnes Incluses. Pour plus de détails sur les limites des clés index, voir les 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-described

3
répondu marvelTracker 2017-08-28 03:10:59
la source

si le fichier contenant les enregistrements est séquentiellement ordonné, un index de regroupement est un index dont la clé de recherche définit également l'ordre séquentiel du fichier. Les indices de regroupement sont aussi appelés indices primaires; le terme indice primaire peut sembler désigner un indice sur une clé primaire, mais de tels indices peuvent en fait être construits sur n'importe quelle clé de recherche. La clé de recherche d'un indice de regroupement est souvent la clé primaire, bien que cela ne soit pas nécessairement le cas. Indices dont la clé de recherche spécifie un ordre différent de l'ordre séquentiel du fichier sont appelés nonclustering indices, secondaire ou d'indices. Les Termes " groupés " et " non-groupés "sont souvent utilisés à la place de" groupage " et " Non-groupage ."

0
répondu hechen0 2018-07-12 19:24:38
la source