Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Question SQL Server pour les experts

Voici une question qui m'a intrigué au moment où je rédigeais mes articles sur SQL Server. J'ai posé la question sur le forum MSDN, mais je n'ai pas obtenu de réponse satisfaisante, je profite donc des experts SQL Server du réseau codes-sources pour peut être avoir une réponse à cette question.

Créons d'abord une table :

CREATE TABLE dbo.Persons
    (
    Id int NOT NULL IDENTITY (1, 1),
    FirstName varchar(50) NOT NULL,
    LastName varchar(50) NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Persons ADD CONSTRAINT
    PK_Persons PRIMARY KEY CLUSTERED (Id) ON [PRIMARY]
GO

Insérons ensuite 5000 enregistrements :

INSERT INTO [dbo].[Persons] (FirstName, LastName) VALUES ('First name', 'Last name')
GO 5000

Consultons ensuite les DMV pour connaître le nombre de pages dans le clustered index :

SELECT * FROM sys.dm_db_index_physical_stats (db_id(), object_id('dbo.MyTable'), null, null, 'DETAILED')

Le résultat dans mon cas est le suivant :

index_type_desc index_depth index_level page_count record_count
CLUSTERED INDEX
2
0
24
5000
CLUSTERED INDEX
2
1
1
24

Nous avons donc un clustered index à deux niveaux. Le niveau racine a bien entendu une page, et 24 entrées correspondantes chacune à une page du niveau suivant, puisque le second niveau a 24 pages.

Exécutons ensuite la requête suivante avec les statistiques IO activées :

SELECT * FROM [dbo].[Persons]

Les statistiques indiquent :

Table 'Persons'. Scan count 1, logical reads 26, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Un scan est normalement effectué de la façon suivante : la page racine va être lue de façon à localiser la première page du niveau terminal de l'index, puis toutes les pages sont scannées dans l'ordre. On devrait donc avoir un logical read pour la racine, puis 24 pour le niveau terminal, donc 25 reads au total.

Avec la requête suivante :

SELECT TOP(50) * FROM [dbo].[Persons]

Seulement 2 pages sont lues (la racine, puis la première page du niveau terminal) :

Table 'Persons'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

J'obtiens donc ce que j'attendais.

Ma question est donc : pourquoi est-ce que dans le premier cas, on observe un 26e read ?

Publié vendredi 9 janvier 2009 11:17 par RaptorXP
Classé sous : ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: Question SQL Server pour les experts

Il me semble que c'est parce qu'il lit le EOF mais je suis pas super expert sql serveur donc a verifier.

vendredi 9 janvier 2009 17:01 by VANNESTE Xavier

# re: Question SQL Server pour les experts

J'immagine que lire null pour le pointeur vers la page suivante dans la derniere page suffit pour savoir qu'il n'y a rien apres.

De plus, la requete

SELECT TOP(4900) * FROM [dbo].[Persons]

lit aussi 26 pages, alors que SQL Server n'a pas besoin d'aller jusqu'a la fin des donnees.

vendredi 9 janvier 2009 17:45 by RaptorXP

# re: Question SQL Server pour les experts

Deja y a un truc qui m'echappe, pourquoi penses tu qu'il passe dans le heap alors que je pensais qu'il passait dans le heap que s'il y avait une clause where ou necessité. Je pense qu'il va directement aux données. Par contre quand tu regardes sur le site de microsoft l'index clustered tu te rend compte qu'il y a un bof et un eof, ca expliquerait le 26 au lieu du 24 car les data sont en liste chainée il faut donc un debut et une fin. Maintenant pourquoi le top 4900 retourne aussi 26 la je dois encore creusé.  

samedi 10 janvier 2009 09:41 by VANNESTE Xavier

# re: Question SQL Server pour les experts

Je crois qu'il s'agit du genre de questions existentielles auxquelles seul un Christian pourrait te répondre en détails car on commence à rentrer dans le coeur du moteur ;-)

Bref, pour ma part, je te dirais que les 26 reads correspondent à la lecture root (l'IAM en lui-même) + la page d'index + les 24 pages de data.

Tu peux t'en rendre compte en tapant:

DBCC IND ('ma_base','Persons',1)

Tu veras alors les 26 lignes correspondant aux pages lues et leur contenu.

Si tu veux voir le contenu plus en détail fait un DBCC Page. J'ai fait un post sur ces deux dbcc non documentées il y a quelques temps ici: http://www.rui.fr/2007/09/19/UndocumentedDBCC.aspx.

Ce qui perturbe plus c'est pourquoi il ne fait que 2 reads sur un top 10 par ex alors que les données se trouvent en page 3 (il me semble qu'il y a un truc avec les stats et la quantitée de données à lire qui fait que si c'est plus rapide pour lui de lire directement la page sans passer par les index il le fait, on aurait donc 2 reads = 1 pour l'iam + 1 pour la page de data mais à vérifier...)

dimanche 11 janvier 2009 23:48 by Rui
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01