web-dev-qa-db-fra.com

Que signifie "Analyse d'index en cluster (en cluster)" sur un plan d'exécution SQL Server?

J'ai une requête qui ne parvient pas à exécuter avec "Impossible d'allouer une nouvelle page pour la base de données 'TEMPDB' en raison d'un espace disque insuffisant dans le groupe de fichiers 'DEFAULT'" 

En ce qui concerne les problèmes, je suis en train d’examiner le plan d’exécution. Il existe deux étapes coûteuses intitulées "Analyse en cluster en cluster (en cluster)". J'ai du mal à savoir ce que cela signifie? 

J'apprécierais toutes les explications sur "Analyse en cluster en cluster (en cluster)" ou des suggestions sur où trouver le document associé?

15
Bin

J'apprécierais toutes les explications de "Analyse en cluster en cluster (En cluster)"

Je vais essayer de vous présenter le moyen le plus simple. Pour une meilleure compréhension, vous devez comprendre à la fois la recherche dans les index et l'analyse.

SO permet de construire la table 

use tempdb GO


create table scanseek  (id  int , name varchar(50) default ('some random names')  )

create clustered index IX_ID_scanseek on scanseek(ID)


declare @i int
SET @i = 0
while (@i <5000)
begin 
insert into scanseek
select @i, 'Name' + convert( varchar(5) ,@i)
set @i =@i+1
END

Une recherche d'index est l'endroit où le serveur SQL utilise la structure b-tree de l'index pour rechercher directement les enregistrements correspondants

 enter image description here

vous pouvez vérifier les nœuds feuille et racine de votre table en utilisant le DMV ci-dessous

-- check index level 
SELECT 
index_level
,record_count
,page_count

,avg_record_size_in_bytes
FROM sys.dm_db_index_physical_stats(DB_ID('tempdb'),OBJECT_ID('scanseek'),NULL,NULL,'DETAILED')
GO

Maintenant, nous avons ici un index clusterisé sur la colonne "ID"

permet de rechercher des enregistrements de correspondance directe 

select * from scanseek where id =340

et regardez le plan d'exécution

 enter image description here

vous avez demandé des lignes directement dans la requête, c'est pourquoi vous avez obtenu une recherche d'index en cluster.

Analyse d'index en cluster: Lorsque le serveur SQL appelle les lignes de haut en bas de l'index en cluster . Par exemple, la recherche de données dans une colonne non clé. Dans notre table, NAME est une colonne non clé. Par conséquent, si nous recherchons des données dans la colonne de nom, nous verrons clustered index scan car toutes les lignes sont au niveau feuille de l'index en cluster.

Exemple 

select * from scanseek where name = 'Name340'

 enter image description here

remarque: j'ai résumé cette réponse pour une meilleure compréhension uniquement. Si vous avez une question ou une suggestion, veuillez commenter ci-dessous.

31

Pour répondre à la réponse de Gordon dans les commentaires, une analyse d'index en cluster consiste à analyser l'un des index de tables pour rechercher les valeurs que vous effectuez en tant que filtre de clause where ou pour une jointure à la table suivante de votre plan de requête.

Les tables peuvent avoir plusieurs index (un en cluster et plusieurs non en cluster) et SQL Server recherchera celui qui convient en fonction du filtre ou de la jointure en cours d'exécution.

Les index clusterisés sont assez bien expliqués sur MSDN. La principale différence entre cluster et non-cluster est que l'index cluster définit comment les lignes sont stockées sur le disque.

Si la recherche de votre index clusterisé est très coûteuse en raison du nombre d'enregistrements, vous pouvez ajouter un index non clusterisé à la table pour les champs que vous recherchez souvent, tels que les champs de date utilisés pour filtrer les plages d'enregistrements.

5
Martin Noreke

Un index clusterisé est un index dans lequel le nœud terminal (feuille) de l'index est la page de données réelle elle-même. Il ne peut y avoir qu'un seul index clusterisé par table, car il spécifie la manière dont les enregistrements sont organisés dans la page de données. Il est généralement (et à quelques exceptions près) considéré comme le type d'index le plus performant (principalement parce qu'il existe un niveau d'indirection moins en moins avant que vous n'atteigniez votre enregistrement de données).

Une "analyse d'index en cluster" signifie que le moteur SQL parcourt votre index en cluster dans la recherche d'une valeur particulière (ou d'un ensemble de valeurs). C'est l'une des méthodes les plus efficaces pour localiser un enregistrement (battement par une "recherche d'index en cluster" dans laquelle le moteur SQL cherche à faire correspondre une valeur sélectionnée).

Le message d'erreur n'a absolument rien à voir avec le plan de requête. Cela signifie simplement que vous n’avez plus d’espace sur TempDB.

3
Curt

Si vous survolez l'étape dans le plan de requête, SSMS affiche une description de son action. Cela vous donnera une compréhension de base de "l'analyse d'index cluster (cluster)" et de toutes les autres étapes impliquées.

0
Edward Brey