Webinaire ouvert "SELECT ordre d'exĂ©cution des requĂȘtes et plan de requĂȘte dans MS SQL Server"

Bonjour encore!

Chers collĂšgues, le dernier jour de janvier, nous lançons le cours «MS SQL Server Developer» , dans le cadre duquel nous avons eu une leçon ouverte thĂ©matique. Nous y avons expliquĂ© comment MS SQL Server exĂ©cute une requĂȘte SELECT, discutĂ© dans quel ordre et ce qui est analysĂ©, et avons Ă©galement plongĂ© un peu dans la lecture du plan de requĂȘte.

Conférencier - Kristina Kucherova , architecte de modÚle de données à la Sberbank de Russie.


Objectifs et itinéraire du webinaire

Les objectifs suivants ont été fixés au début du webinaire:

  1. Découvrez comment le serveur exécute la demande et pourquoi cela se produit de cette maniÚre.
  2. Apprendre Ă  lire un plan de requĂȘte.

Pour les atteindre, l'enseignant a préparé un parcours simple mais efficace:



Pourquoi ai-je besoin d'un plan de requĂȘte?

Le plan de requĂȘte est un outil trĂšs utile que, malheureusement, de nombreux dĂ©veloppeurs n'utilisent pas. À premiĂšre vue, il peut sembler qu'il n'est pas nĂ©cessaire de connaĂźtre la mĂ©canique de la demande. Cependant, si vous comprenez ce qui se passe dans SQL Server, vous pouvez Ă©crire une requĂȘte plus efficace. Et cela aidera beaucoup, par exemple, lors de l'optimisation.

Comment voyons-nous une requĂȘte SELECT?

Voyons Ă  quoi ressemble la requĂȘte SELECT:

SELECT [champ1], [champ2] ...
Quels domaines choisissons-nous?
DE [table]
D'oĂč?
O [[conditions]
OĂč sont les conditions
GROUPE PAR [champ1]
Regrouper par champs
AYANT [conditions]
Avoir telle ou telle condition
COMMANDER PAR [field1]
Commande (trier)

Comment comprendre oĂč aller pour les donnĂ©es?

La premiĂšre chose que le serveur essaie de comprendre quand une demande arrive est oĂč aller pour les donnĂ©es. La commande FROM rĂ©pond Ă  cette question, car c'est ici que nous aurons une liste de tables (ou le nom d'une table).

Pour plus de clarté, imaginons que notre serveur est une sorte de majordome, que nous commandons pour venir nous chercher en vacances. En conséquence, le majordome commence à réfléchir, mais dans quel placard sont les choses nécessaires (dans quelle table avez-vous besoin de prendre les données)? Et pour que notre majordome puisse facilement terminer sa tùche, nous utilisons FROM.



Comment comprendre quelles données prendre?

Disons que le majordome a trouvĂ© le bon placard et l'a ouvert. Mais quelles choses prendre? Peut-ĂȘtre que nous allons dans une station de ski? Ou peut-ĂȘtre sur une plage chaude et ensoleillĂ©e? Pour que nos choses correspondent Ă  la mĂ©tĂ©o, la commande WHERE est utile pour nous, qui dĂ©finit les conditions, c'est-Ă -dire nous permet de filtrer les donnĂ©es. S'il fait chaud, nous prenons des ardoises, des chemises et des maillots de bain, s'il fait froid - mitaines, chaussettes tricotĂ©es, pulls)).

L'Ă©tape suivante consiste Ă  attacher ces donnĂ©es Ă  des groupes, ce qui se produit avec GROUP BY (T-shirts sĂ©parĂ©ment, chaussettes sĂ©parĂ©ment). Selon les rĂ©sultats du regroupement, une condition supplĂ©mentaire peut ĂȘtre imposĂ©e Ă  l'aide de HAVING (par exemple, Ă©liminer les Ă©lĂ©ments non appariĂ©s). En fin de compte, nous ajoutons tout en utilisant ORDER BY, obtenant la valise finie des choses Ă  la sortie, ou plutĂŽt, un bloc de donnĂ©es ordonnĂ©.



Soit dit en passant, il y a une nuance, mais elle consiste dans le fait qu'il y a une diffĂ©rence entre les conditions qui doivent ĂȘtre Ă©crites dans OERE et celles dans HAVING. Mais c'est mieux Ă  voir dans la vidĂ©o.

Nous continuons. Le chemin d'exĂ©cution de la demande est enregistrĂ© en tant que plan de demande dans le cache, c'est-Ă -dire que notre majordome Ă©crit tout, car il est un bon majordome - et si vous voulez rĂ©pĂ©ter votre commande l'annĂ©e prochaine? Et de tels plans, en principe, peuvent ĂȘtre nombreux.

Types de connexions dans le plan de requĂȘte

Il existe trois connexions que vous pouvez rencontrer en termes de requĂȘte:

  1. Boucle imbriquée.
  2. Fusionner la jointure.
  3. Hash join.

Avant de nous attarder sur chacun d'eux plus en dĂ©tail, rĂ©sumons pourquoi nous devrions mĂȘme lire le plan de requĂȘte. Ceci est en fait trĂšs utile car vous apprendrez:

  • quel indice est utilisĂ©;
  • dans quel ordre adhĂ©rez-vous;
  • ce qui est sĂ©lectionnĂ© dans le tampon;
  • combien le serveur dĂ©pense des ressources pour l'opĂ©ration;
  • quelle est la diffĂ©rence entre un plan hypothĂ©tique et un plan rĂ©el.

Boucle imbriquée

Disons que nous devons joindre les données de différentes tables. Présentons ces tableaux comme ... une petite quantité de chocolats Skittles et l'emballage complet de M&M.



Lors de la connexion d'un type de boucle imbriquĂ©e, nous prenons le bonbon Skittles, puis nous obtenons le bonbon aveugle du package de M&M. Si nous ne tombons pas sur un bonbon de la mĂȘme couleur (c'est notre condition), nous obtenons le suivant, c'est-Ă -dire qu'il y a un buste habituel. Par consĂ©quent, nous pouvons dire que la connexion en boucle imbriquĂ©e convient mieux Ă  de petites quantitĂ©s de donnĂ©es. De toute Ă©vidence, s'il y a beaucoup de donnĂ©es, la suppression n'est pas la meilleure option.



Voyons Ă  quoi cela ressemble dans le panneau SQL:

--drop table skittles --drop table mms --    create table mms (id int identity(1,1), color varchar(25), taste varchar(15)) insert into mms (color, taste) values ('yellow', 'chocolate') insert into mms (color, taste) values ('red', 'nuts') create clustered index IX_mms_color ON mms(color); create table skittles (id int identity(1,1), color varchar(25), taste varchar(15)) create index IX_skittles_id ON skittles(id); create clustered index IX_skittles_color ON skittles(color); insert into skittles (color, taste) values ('red', 'cherry') insert into skittles (color, taste) values ('blue', 'strange') insert into skittles (color, taste) values ('yellow', 'lemon') insert into skittles (color, taste) values ('green', 'apple') insert into skittles (color, taste) values ('orange', 'orange') --    select mms.* from mms join skittles on mms.color = skittles.color select * from mms join skittles on mms.color = skittles.color 



Fusionner la jointure

Une connexion est utilisĂ©e pour de grandes quantitĂ©s de donnĂ©es. Lorsque vous avez une jointure de fusion, vos deux tables ont un index par lequel elles peuvent ĂȘtre jointes. Dans le cas des bonbons, c'est comme si nous les avions disposĂ©s Ă  l'avance par couleur.

Cela ressemble Ă  ceci:



 --2 tables 50000 rows, only clustered index by color, color is not unique select COUNT(*) from mms_big join skittles_big on mms_big.color = skittles_big.color 



La fusion de jointure est bonne dans les cas suivants:

  • grands ensembles de donnĂ©es;
  • les mĂȘmes champs de connexion du mĂȘme type;
  • les champs de connexion ont des indices.

Hash Join

La jointure par hachage est utilisée pour de grandes quantités de données non triées. Pour rejoindre les tables dans ce cas, vous devez créer quelque chose qui imite l'index.

Exemple de jointure par hachage:

 --drop table skittles --drop table mms --    create table mms (id int identity(1,1), color varchar(25), taste varchar(15)) insert into mms (color, taste) values ('yellow', 'chocolate') insert into mms (color, taste) values ('red', 'nuts') insert into mms (color, taste) values ('blue', 'strange') insert into mms (color, taste) values ('green', 'chocolate') insert into mms (color, taste) values ('orange', 'chocolate') create table skittles (id int identity(1,1), color varchar(25), taste varchar(15)) insert into skittles (color, taste) values ('red', 'cherry') insert into skittles (color, taste) values ('blue', 'strange') insert into skittles (color, taste) values ('yellow', 'lemon') insert into skittles (color, taste) values ('green', 'apple') insert into skittles (color, taste) values ('orange', 'orange') --    select * from mms join skittles on mms.color = skittles.color 



Pour plus de clarté, nous rappelons nos bonbons:



L'utilisation de Hash Join implique 2 phases d'action:

  1. Build - une table de hachage est construite sur la plus petite table. Pour chaque valeur du tableau n ° 1, un hachage est considéré. La valeur est stockée dans une table de hachage et le hachage calculé est utilisé comme clé.
  2. Sonde. Pour chaque ligne du tableau n ° 2, la valeur de hachage est calculée pour les champs spécifiés dans join (operator =). Un hachage est recherché dans la table de hachage, les valeurs des champs sont vérifiées.







Lorsque la jonction de hachage est bonne:

  • grand ensemble de donnĂ©es;
  • pas d'indices marginaux.

Un point important: s'il n'y a pas assez de mémoire, l'enregistrement ira à tempdb - sur le disque.

Amis, en plus de ce qui prĂ©cĂšde, la leçon ouverte comprenait Ă©galement d'autres points intĂ©ressants, qui sont mieux vus en regardant la vidĂ©o. Nous vous suggĂ©rons de visiter la journĂ©e portes ouvertes du cours "DĂ©veloppeur MS SQL Server", oĂč vous pourrez poser toutes vos questions au professeur.

L'enseignante PS Kristina Kucherova remercie Jes Schultz Borland pour sa présentation avec PASS Summitt Execution Plans: The Secret to Query Tuning Success, qui a été utilisé pour préparer la leçon ouverte.

Source: https://habr.com/ru/post/fr437828/


All Articles