Guide de référence des opérateurs Showplan logiques et physiques
Les opérateurs décrivent comment SQL Server exécute une requête ou une instruction DML (Data Manipulation Language). L'optimiseur de requête utilise des opérateurs pour construire un plan de requête qui crée le résultat spécifié dans la requête ou pour exécuter l'opération spécifiée dans l'instruction DML. Le plan de requête est une arborescence composée d'opérateurs physiques. Vous pouvez afficher le plan de requête à l'aide des instructions SET SHOWPLAN, des options plan d'exécution graphique dans SQL Server Management Studio ou des classes d'événements Showplan de SQL Server Profiler.
Les opérateurs sont classés en opérateurs logiques et physiques.
Opérateurs logiques
Les opérateurs logiques décrivent l'opération algébrique relationnelle utilisée pour traiter une instruction. En d'autres termes, les opérateurs logiques décrivent de manière conceptuelle les opérations à exécuter.Opérateurs physiques
Les opérateurs physiques mettent en œuvre l'opération décrite par des opérateurs logiques. Chaque opérateur physique désigne un objet ou une routine chargée d'effectuer une opération. Par exemple, certains opérateurs physiques permettent d'accéder à des colonnes ou des lignes à partir d'une table, d'un index ou d'une vue. D'autres opérateurs physiques exécutent d'autres opérations telles que des calculs, des agrégations, des contrôles de l'intégrité des données vérifie ou des jointures. Des coûts sont associés aux opérateurs physiques.Les opérateurs physiques s'initialisent, collectent des données et se ferment. En particulier, l'opérateur physique peut répondre aux trois méthodes d'appel suivantes :
Init(): avec la méthode Init(), l'opérateur physique s'initialise et configure les structures de données nécessaires. Il arrive que l'opérateur physique reçoive beaucoup d'appels Init(), bien qu'en général il n'en reçoive qu'un.
GetNext(): avec la méthode GetNext(), l'opérateur physique récupère la première ligne de données ou la suivante. L'opérateur physique peut recevoir zéro ou de nombreux appels GetNext().
Close(): avec la méthode Close(), l'opérateur physique effectue certaines opérations de nettoyage et se ferme. Un opérateur physique reçoit un seul appel Close().
La méthode GetNext() renvoie une ligne de données, et le nombre d'appels qu'elle reçoit s'affiche sous ActualRows dans le résultat Showplan produit au moyen de SET STATISTICS PROFILE ON ou SET STATISTICS XML ON. Pour plus d'informations sur ces options SET, consultez SET STATISTICS PROFILE (Transact-SQL) et SET STATISTICS XML (Transact-SQL).
Les compteurs ActualRebinds et ActualRewinds qui s'affichent dans le résultat de Showplan indiquent le nombre de fois que la méthode Init() est appelée. Sauf si un opérateur se trouve sur le côté intérieur d'une jointure de boucles, ActualRebinds est égal à un et ActualRewinds est égal à zéro. Si un opérateur se trouve sur le côté intérieur d'une jointure de boucles, le nombre total de reliaisons et de rembobinages doit être égal au nombre de ligne traitées sur le côté extérieur de la jointure. Une reliaison signifie qu'un ou plusieurs des paramètres corrélés de la jointure ont changé, et que le côté intérieur doit être réévalué. Un rembobinage signifie qu'aucun des paramètres corrélés n'a changé, et que l'ancien jeu de résultats interne peut être réutilisé.
ActualRebinds et ActualRewinds sont présents dans le résultat de Showplan XML produit en utilisant SET STATISTICS XML ON. Ils ne sont remplis que pour les opérateurs Nonclustered Index Spool, Remote Query, Row Count Spool, Sort, Table Spool et Table-valued Function. ActualRebinds et ActualRewinds peuvent aussi être remplis pour les opérateurs Assert et Filter lorsque l'attribut StartupExpression est défini à TRUE.
Lorsque ActualRebinds et ActualRewinds sont présents dans un Showplan XML, ils sont comparables à EstimateRebinds et EstimateRewinds. S'ils sont absents, le nombre estimé de lignes (EstimateRows) est comparable au nombre réel de lignes (ActualRows). Sachez que le résultat du Showplan graphique réel affiche des zéros pour les reliaisons réelles et les rembobinages réels lorsqu'ils sont absents.
Un compteur apparenté, ActualEndOfScans, est disponible uniquement si le résultat de Showplan est produit au moyen de SET STATISTICS XML ON. Chaque fois qu'un opérateur physique atteint la fin de son flux de données, le compteur est incrémenté de un. Un opérateur physique peut atteindre la fin de son flux de données zéro, une ou de nombreuses fois. Comme pour les reliaisons et les rembobinages, le nombre de fins d'analyses ne peut être supérieur à un que si l'opérateur se situe sur le côté intérieur d'une jointure de boucles. Le nombre de fins d'analyses doit être inférieur ou égal au nombre total des reliaisons et des rembobinages.
Mappage d'opérateurs physiques et logiques
L'optimiseur de requête crée un plan de requête sous forme d'arborescence d'opérateurs logiques. Après avoir créé le plan, l'optimiseur de requête choisit l'opérateur physique le plus efficace pour chaque opérateur logique. L'optimiseur de requête utilise une approche basée sur les coûts pour déterminer l'opérateur physique qui mettra en œuvre un opérateur logique.
Généralement, une opération logique peut être mise en œuvre par plusieurs opérateurs physiques. Toutefois, en de rares occasions, un opérateur physique peut également mettre en œuvre plusieurs opérations logiques.
Description des opérateurs
Cette section contient la description des opérateurs logiques et physiques.
Icône du plan d'exécution graphique |
Opérateur Showplan |
Description |
---|---|---|
Aucune |
Aggregate |
L'opérateur Aggregate calcule une expression contenant MIN, MAX, SUM, COUNT ou AVG. L'opérateur Aggregate peut être un opérateur logique ou physique. |
Arithmetic Expression |
L'opérateur Arithmetic Expression calcule une nouvelle valeur à partir de valeurs existantes dans une ligne. Arithmetic Expression n'est pas utilisé dans SQL Server 2012. |
|
Assert |
L'opérateur Assert vérifie une condition. Par exemple, il valide l'intégrité référentielle ou garantit qu'une sous-requête scalaire retourne une ligne. Pour chaque ligne d'entrée, l'opérateur Assert résout l'expression de la colonne Argument du plan d'exécution. Si cette expression a pour résultat NULL, l'opérateur Assert passe la ligne et la requête d'exécution se poursuit. Si cette expression a pour résultat une valeur non NULL, l'erreur correspondante est levée. L'opérateur Assert est un opérateur physique. |
|
Assign |
L'opérateur Assign assigne la valeur d'une expression ou une constante à une variable. Assign est un élément de langage. |
|
Aucune |
Asnyc Concat |
L'opérateur Asnyc Concat sert uniquement dans le cadre des requêtes distantes (requêtes distribuées). Il a n enfants et un nœud parent. En règle générale, certains des enfants sont des ordinateurs distants qui participent à une requête distribuée. Asnyc Concat émet des appels open() à tous les enfants simultanément et applique ensuite une bitmap à chacun d'eux. Pour chaque bit à 1, Async Concat envoie à la demande les lignes obtenues au nœud parent. |
Bitmap |
SQL Server utilise l'opérateur Bitmap pour implémenter le filtrage Bitmap dans les plans de requêtes parallèles. Le filtrage Bitmap accélère l'exécution des requêtes en éliminant les lignes contenant des valeurs de clés qui ne peuvent pas produire d'enregistrements de jointure avant de transmettre les lignes à un autre opérateur tel que l'opérateur Parallelism. Un filtre Bitmap utilise une représentation compacte d'un ensemble de valeurs d'une table dans une partie de l'arborescence de l'opérateur pour filtrer les lignes d'une seconde table dans une autre partie de l'arborescence. En supprimant les lignes inutiles tôt dans la requête, les opérateurs suivants ont moins de lignes à utiliser, et les performances globales de la requête sont accrues. L'optimiseur détermine si une bitmap est suffisamment sélective pour être utile et dans quels opérateurs appliquer le filtre. Bitmap est un opérateur physique. |
|
![]() |
Bitmap Create |
L'opérateur Bitmap Create apparaît dans la sortie de plan d'exécution de requêtes où les bitmaps sont construites. Bitmap Create est un opérateur logique. |
Bookmark Lookup |
L'opérateur Bookmark Lookup utilise un signet (ID de ligne ou clé de clustering) pour rechercher la ligne correspondante dans la table ou l'index cluster. La colonne Argument contient l'étiquette de signet utilisée pour rechercher la ligne dans la table ou l'index cluster. Cette colonne contient également le nom de la table ou de l'index cluster où s'effectue la recherche de la ligne. Si la clause WITH PREFETCH apparaît dans la colonne Argument, cela signifie que le processeur de requêtes a décidé que la prérécupération asynchrone (lecture anticipée) constitue la solution optimale pour la recherche de signets dans la table ou dans l'index cluster. Bookmark Lookup n'est pas utilisé dans SQL Server 2012. À la place, Clustered Index Seek et RID Lookup fournissent des fonctionnalités de recherche de signet. L'opérateur Key Lookup fournit également ces fonctionnalités. |
|
Aucune |
Branch Repartition |
Dans un plan de requête parallèle, il existe parfois des régions conceptuelles composées d'itérateurs. Tous les itérateurs de ces régions peuvent être exécutés par des threads parallèles. Les régions elles-mêmes doivent être exécutées séquentiellement. Certains itérateurs Parallelism d'une région distincte sont appelés Branch Repartition. L'itérateur Parallelism situé à la limite de deux régions de ce type est appelé Segment Repartition. Branch Repartition et Segment Repartition sont des opérateurs logiques. |
Aucune |
Broadcast |
Broadcast possède un nœud enfant et n nœuds parents. Broadcast envoie ses lignes d'entrée à plusieurs consommateurs à la demande. Chaque consommateur obtient toutes les lignes. Par exemple, si tous les consommateurs se trouvent des côtés construction d'une jointure de hachage, n copies des tables de hachage sont générées. |
![]() |
Build Hash |
Indique la création d'une table de hachage de lot pour un index columnstore optimisé en mémoire xVelocity. |
Aucun |
Cache |
Cache est une version spéciale de l'opérateur Spool. Il ne stocke qu'une seule ligne de données. Cache est un opérateur logique. Cache n'est pas utilisé dans SQL Server 2012. |
Clustered Index Delete |
L'opérateur Clustered Index Delete supprime des lignes de l'index cluster spécifié dans la colonne Argument du plan d'exécution de requête. Si un prédicat WHERE:() figure dans la colonne Argument, seules les lignes répondant au prédicat sont supprimées. Clustered Index Delete est un opérateur physique. |
|
Clustered Index Insert |
L'opérateur Clustered Index Insert Showplan insère des lignes de son entrée dans l'index cluster spécifié dans la colonne Argument. Cette colonne contient également un prédicat SET:(), qui indique la valeur à laquelle chaque colonne est définie. Si Clustered Index Insert ne possède pas d'enfant pour les valeurs insert, la ligne insérée est extraite de l'opérateur Insert lui-même. Clustered Index Insert est un opérateur physique. |
|
Clustered Index Merge |
L'opérateur Clustered Index Merge applique un flux de données de fusion à un index cluster. L'opérateur supprime, met à jour ou insère des lignes de l'index cluster spécifié dans la colonne Argument de l'opérateur. L'opération réellement effectuée dépend de la valeur d'exécution de la colonne ACTION spécifiée dans la colonne Argument de l'opérateur. Clustered Index Merge est un opérateur physique. |
|
Clustered Index Scan |
L'opérateur Clustered Index Scan analyse l'index cluster spécifié dans la colonne Argument du plan d'exécution de requête. Lorsqu'un prédicat facultatif WHERE:() y figure, seules les lignes répondant au prédicat sont retournées. Si la colonne Argument contient la clause ORDERED, cela signifie que le processeur de requêtes a demandé le renvoi des sorties de lignes dans l'ordre dans lequel l'index cluster les a triées. Si la clause ORDERED n'y figure pas, le moteur de stockage effectue la recherche dans l'index de façon optimale, sans nécessairement trier la sortie. Clustered Index Scan est un opérateur logique et physique. |
|
Clustered Index Seek |
L'opérateur Clustered Index Seek utilise la fonction recherche des index pour extraire des lignes d'un index cluster. La colonne Argument contient le nom de l'index cluster utilisé et le prédicat SEEK:(). Le moteur de stockage utilise l'index pour ne traiter que les lignes répondant à ce prédicat SEEK:(). Il peut également inclure un prédicat WHERE: () dans lequel le moteur de stockage est évalué par rapport à toutes les lignes répondant au prédicat SEEK:(), mais ceci est facultatif et ne fait pas appel aux index pour exécuter ce processus. Si la colonne Argument contient la clause ORDERED, le processeur de requêtes a déterminé que les lignes doivent être retournées dans l'ordre dans lequel l'index cluster les a triées. Si la clause ORDERED n'y figure pas, le moteur de stockage effectue la recherche dans l'index de façon optimale, sans nécessairement trier la sortie. Autoriser la sortie à conserver son classement peut s'avérer moins efficace que la production d'une sortie non triée. Lorsque le mot clé LOOKUP apparaît, une recherche de signet est alors exécutée. Dans SQL Server 2008 et les versions ultérieures, l'opérateur Key Lookup fournit la fonctionnalité de recherche de signet. Clustered Index Seek est un opérateur logique et physique. |
|
Clustered Index Update |
L'opérateur Clustered Index Update met à jour les lignes d'entrée dans l'index cluster spécifié dans la colonne argument. Si un prédicat WHERE:() est présent, seules les lignes répondant à ce prédicat sont mises à jour. Si un prédicat SET:() est présent, chaque colonne mise à jour prend cette valeur. Si un prédicat DEFINE:() est présent, il établit la liste des valeurs définies par cet opérateur. Ces valeurs peuvent être référencées dans la clause SET ou ailleurs dans cet opérateur, et ailleurs dans cette requête. Clustered Index Update est un opérateur et logique et physique. |
|
Collapse |
L'opérateur Collapse permet d'optimiser le traitement de mise à jour des données. Lorsqu'une mise à jour est effectuée, elle peut être divisée (par l'opérateur Split) en opérations de suppression puis d'insertion des données. La colonne Argument contient une clause GROUP BY:() qui spécifie la liste des colonnes clés. Si le processeur de requêtes rencontre des lignes adjacentes d'instructions de suppression puis d'insertion des mêmes valeurs de clé, il regroupe alors ces opérations en une seule et même opération de mise à jour pour gagner en efficacité. Collapse est un opérateur logique et physique. |
|
Columnstore Index Scan |
L'opérateur Columnstore Index Scan analyse l'index columnstore spécifié dans la colonne Argument du plan d'exécution de requête. |
|
Compute Scalar |
L'opérateur Compute Scalar évalue une expression pour produire une valeur scalaire calculée. Celle-ci peut ensuite être retournée à l'utilisateur, référencée n'importe où dans la requête, ou les deux. Les deux sont utilisés par exemple dans un prédicat de filtre ou de jointure. Compute Scalar est un opérateur logique et physique. Il se peut que les opérateurs Compute Scalar qui apparaissent dans les plans d'exécution générés par SET STATISTICS XML ne contiennent pas l'élément RunTimeInformation. Dans les plans d'exécution graphiques, Actual Rows, Actual Rebinds et Actual Rewinds peuvent être absents de la fenêtre Propriétés lorsque l'option Inclure le plan d'exécution réel est sélectionnée dans SQL Server Management Studio. Si cela se produit, cela signifie que, même si ces opérateurs ont été utilisés dans le plan de requête compilé, leur travail a été exécuté par d'autres opérateurs dans le plan de requête à l'exécution. Notez également que le nombre d'exécutions figurant dans le résultat du plan d'exécution produit par SET STATISTICS PROFILE équivaut à la somme des reliaisons et des rembobinages des plans d'exécution produits par SET STATISTICS XML. |
|
Concatenation |
L'opérateur Concatenation analyse plusieurs entrées et renvoie chaque ligne analysée. L'opérateur Concatenation sert généralement à implémenter la construction Transact-SQL UNION ALL. L'opérateur physique Concatenation a deux entrées ou plus, et une sortie. L'opérateur Concatenation copie des lignes depuis le premier flux d'entrée vers le flux de sortie, puis répète l'opération pour chacun des autres flux d'entrée. Concatenation est un opérateur logique et physique. |
|
Constant Scan |
L'opérateur Constant Scan introduit une ou plusieurs lignes de constante dans une requête. Un opérateur Compute Scalar est souvent utilisé après un opérateur Constant Scan pour ajouter des colonnes à une ligne produite par l'opérateur Constant Scan. |
|
Convert |
L'opérateur Convert convertit une expression d'un type de données scalaire en un autre. Convert est un élément de langage. |
|
Aucune |
Cross Join |
L'opérateur Cross Join relie chaque ligne de la première entrée (du haut) à chaque ligne de la deuxième entrée (du bas). Cross Join est un opérateur logique. |
catchall |
L'icône catchall s'affiche lorsque la logique qui produit des plans de requête graphiques ne parvient pas à trouver une icône adaptée pour l'itérateur. Cette icône n'indique pas nécessairement une condition d'erreur. Il existe trois types d'icône catchcall : bleu (pour les itérateurs), orange (pour les curseurs) et vert (pour les éléments du langage Transact-SQL). |
|
Aucune |
Curseur |
Les opérateurs physiques et logiques de curseur sont utilisés pour décrire le mode d'exécution d'une requête ou d'une mise à jour impliquant des opérations de curseur. Les opérateurs physiques décrivent l'algorithme d'implémentation physique utilisé pour traiter le curseur, par exemple, à l'aide d'un curseur contrôlé par clés. Chaque étape de l'exécution d'un curseur implique un opérateur physique. Les opérateurs logiques décrivent une propriété du curseur, par exemple, le curseur est en lecture seule. Les opérateurs logiques incluent Asynchronous, Optimistic, Primary, Read Only, Scroll Locks et Secondary et Synchronous. Les opérateurs physiques incluent Dynamic, Fetch Query, Keyset, Population Query, Refresh Query et Snapshot. |
Declare |
L'opérateur Declare alloue une variable locale dans le plan de requête. Declare est un élément de langage. |
|
Delete |
L'opérateur Delete supprime d'un objet les lignes qui répondent au prédicat facultatif de la colonne Argument. |
|
Deleted Scan |
L'opérateur Deleted Scan analyse la table supprimée dans un déclencheur. |
|
Aucune |
Distinct |
L'opérateur Distinct supprime les doublons d'un ensemble de lignes ou d'une collection de valeurs. Distinct est un opérateur logique. |
Aucune |
Distinct Sort |
L'opérateur logique Distinct Sort analyse les entrées en éliminant les doublons et en triant les colonnes spécifiées dans le prédicat DISTINCT ORDER BY:() de la colonne Argument. Distinct Sort est un opérateur logique. |
Distribute Streams |
L'opérateur Distribute Streams est utilisé uniquement dans les plans de requête parallèles. L'opérateur Distribute Streams ne mobilise qu'un seul flux d'entrée d'enregistrements et produit plusieurs flux de sortie. Le contenu et le format des enregistrements ne sont pas modifiés. Chaque enregistrement provenant du flux d'entrée apparaît dans l'un des flux de sortie. Cet opérateur conserve automatiquement l'ordre relatif des enregistrements d'entrée dans les flux de sortie. Habituellement, le hachage est utilisé pour définir à quel flux de sortie appartient un enregistrement d'entrée particulier. Si la sortie est partitionnée, la colonne Argument contient alors un prédicat PARTITION COLUMNS:() et les colonnes de partitionnement. Distribute Streams est un opérateur logique. |
|
Dynamic |
L'opérateur Dynamic utilise un curseur capable de détecter toutes les modifications effectuées par d'autres utilisateurs. |
|
Eager Spool |
L'opérateur Eager Spool utilise l'ensemble de l'entrée en stockant chaque ligne dans un objet temporaire masqué stocké dans la base de données tempdb. Si l'opérateur est réutilisé (par un opérateur Nested Loops, par exemple) mais qu'aucune nouvelle liaison n'est nécessaire, les données mises en attente sont utilisées au lieu d'une nouvelle analyse de l'entrée. Si une nouvelle liaison est nécessaire, les données spoulées sont supprimées et l'objet en attente est recréé par la réanalyse de l'entrée (nouvellement liée). L'opérateur Eager Spool crée le fichier spouleur avec « avidité » : lorsque l'opérateur parent du spool demande la première ligne, l'opérateur spool consomme toutes les lignes de son opérateur d'entrée et les stocke dans le spool. Eager Spool est un opérateur logique. |
|
Fetch Query |
L'opérateur Fetch Query extrait des lignes lorsqu'une extraction est émise à l'aide d'un curseur. |
|
Filter |
L'opérateur Filter analyse l'entrée en ne retournant que les lignes répondant à l'expression du filtre (prédicat) qui apparaît dans la colonne Argument. |
|
Aucune |
Flow Distinct |
L'opérateur logique Flow Distinct analyse les entrées en éliminant les doublons. Alors que l'opérateur Distinct mobilise l'intégralité des entrées avant de produire une sortie, l'opérateur FlowDistinct retourne chaque ligne à mesure qu'il l'obtient de l'entrée (sauf si la ligne est un doublon, auquel cas elle est supprimée). |
Aucune |
Full Outer Join |
L'opérateur logique Full Outer Join retourne chaque ligne répondant au prédicat de jointure de la première entrée (du haut) joint à chaque ligne de la seconde entrée (du bas). Il renvoie également les lignes de :
L'entrée qui ne contient pas les valeurs correspondantes est retournée sous forme de valeur NULL. Full Outer Join est un opérateur logique. |
Gather Streams |
L'opérateur Gather Streams n'est utilisé que dans les plans de requête parallèle. Cet opérateur mobilise plusieurs flux d'entrée et ne produit qu'un flux de sortie d'enregistrements en associant les flux d'entrée. Le contenu et le format des enregistrements ne sont pas modifiés. Si l'opérateur conserve l'ordre, tous les flux d'entrée doivent alors être classés. Si la sortie est triée, la colonne Argument contient un prédicat ORDER BY:() et les noms des colonnes classées. Gather Streams est un opérateur logique. |
|
Hash Match |
L'opérateur Hash Match crée une table de hachage en calculant une valeur de hachage pour chaque ligne à partir de son entrée de génération. Un prédicat HASH:() accompagné d'une liste de colonnes utilisées pour créer une valeur de hachage apparaît dans la colonne Argument. Ensuite, il calcule, pour chaque ligne de sondage (le cas échéant), une valeur de hachage en utilisant la même fonction de hachage, et consulte la table de hachage pour trouver les correspondances. Si un prédicat résiduel (identifié par RESIDUAL:() dans la colonne Argument) y figure, il doit également trouver les lignes qui doivent lui correspondre. Son comportement dépend de l'opération logique exécutée :
Hash Match est un opérateur physique. |
|
If |
L'opérateur If effectue un traitement conditionnel basé sur une expression. If est un élément de langage. |
|
Aucune |
Inner Join |
L'opérateur logique Inner Join retourne chaque ligne répondant à la jointure de la première entrée (du haut) et de la seconde entrée (du bas). |
Insert |
L'opérateur logique Insert insère chaque ligne de son entrée dans l'objet spécifié dans la colonne Argument. L'opérateur physique est l'opérateur Table Insert, Index Insert ou Clustered Index Insert. |
|
Inserted Scan |
L'opérateur Inserted Scan analyse la table insérée. Inserted Scan est un opérateur logique et physique. |
|
Intrinsic |
L'opérateur Intrinsic appelle une fonction Transact-SQL interne. Intrinsic est un élément de langage. |
|
Iterator |
L'icône catchall Iterator s'affiche lorsque la logique qui produit des plans de requête graphiques ne parvient pas à trouver une icône adaptée pour l'itérateur. Cette icône n'indique pas nécessairement une condition d'erreur. Il existe trois types d'icône catchcall : bleu (pour les itérateurs), orange (pour les curseurs) et vert (pour les constructions de langage Transact-SQL). |
|
Key Lookup |
L'opérateur Key Lookup est une recherche de signet sur une table avec un index cluster. La colonne Argument contient le nom de l'index cluster et la clé de clustering utilisée pour rechercher la ligne dans l'index cluster. Key Lookup est toujours accompagné par un opérateur Nested Loops. Si la clause WITH PREFETCH apparaît dans la colonne Argument, cela signifie que le processeur de requêtes a décidé que la prérécupération asynchrone (lecture anticipée) constitue la solution optimale pour la recherche de signets dans l'index cluster. L'utilisation d'un opérateur Key Lookup dans un plan de requête indique que la requête peut bénéficier du réglage des performances. Par exemple, l'ajout d'un index explicatif peut améliorer les performances des requêtes. |
|
Keyset |
L'opérateur Keyset utilise un curseur qui peut détecter les mises à jour, mais pas les insertions effectuées par d'autres. |
|
Language Element |
L'icône catchall Language Element s'affiche lorsque la logique qui produit des plans de requête graphiques ne parvient pas à trouver une icône adaptée pour l'itérateur. Cette icône n'indique pas nécessairement une condition d'erreur. Il existe trois types d'icône catchcall : bleu (pour les itérateurs), orange (pour les curseurs) et vert (pour les constructions de langage Transact-SQL). |
|
Lazy Spool |
L'opérateur logique Lazy Spool stocke chaque ligne de son entrée dans un objet temporaire masqué, lui-même stocké dans la base de données tempdb. Si l'opérateur est réutilisé (par un opérateur Nested Loops, par exemple) mais qu'aucune nouvelle liaison n'est nécessaire, les données mises en attente sont utilisées au lieu d'une nouvelle analyse de l'entrée. Si une nouvelle liaison est nécessaire, les données mises en attente sont supprimées et l'objet en attente est recréé par une nouvelle analyse de l'entrée (liée une nouvelle fois). L'opérateur Lazy Spool crée son fichier d'attente de manière « économique » : chaque fois que l'opérateur parent du fichier d'attente demande une ligne, l'opérateur en attente obtient une ligne de son opérateur d'entrée et la stocke dans le fichier d'attente, au lieu de consommer toutes les lignes simultanément. Lazy Spool est un opérateur logique. |
|
Aucune |
Left Anti Semi Join |
L'opérateur Left Anti Semi Join retourne chaque ligne de la première entrée (du haut) lorsqu'il n'y a aucune ligne correspondante dans la seconde entrée (du bas). Si aucun prédicat de jointure n'est présent dans la colonne Argument, chaque ligne est une ligne correspondante. Left Anti Semi Join est un opérateur logique. |
Aucune |
Left Outer Join |
L'opérateur logique Left Outer Join renvoie chaque ligne répondant à la jointure de la première entrée (du haut) et de la seconde entrée (du bas). Il renvoie également toute ligne de la première entrée n'ayant pas de ligne en correspondance dans la seconde entrée. Les lignes sans correspondance dans la seconde entrée sont retournées sous forme de valeurs NULL. Si aucun prédicat de jointure n'est présent dans la colonne Argument, chaque ligne est une ligne correspondante. Left Outer Join est un opérateur logique. |
Aucune |
Left Semi Join |
L'opérateur Left Semi Join retourne chaque ligne de la première entrée (du haut) lorsqu'il y a une ligne correspondante dans la seconde entrée (du bas). Si aucun prédicat de jointure n'est présent dans la colonne Argument, chaque ligne est une ligne correspondante. Left Semi Join est un opérateur logique. |
Log Row Scan |
L'opérateur Log Row Scan analyse le journal des transactions. Log Row Scan est un opérateur logique et physique. |
|
Merge Interval |
L'opérateur Merge Interval fusionne plusieurs intervalles (susceptibles de se chevaucher) pour produire des intervalles minimaux qui ne se chevauchent pas, intervalles qui seront ensuite utilisés pour rechercher des entrées d'index. Cet opérateur apparaît généralement au-dessus d'un ou plusieurs opérateurs Compute Scalar sur des opérateurs Constant Scan, qui créent les intervalles (représentés sous forme des colonnes d'une ligne) que l'opérateur fusionne. Merge Interval est un opérateur logique et physique. |
|
Merge Join |
L'opérateur Merge Join exécute les opérations logiques suivantes : inner join, left outer join, left semi join, left anti semi join, right outer join, right semi join, right anti semi join et union. Dans la colonne Argument, l'opérateur Merge Join contient un prédicat MERGE:() si l'opération exécute une jointure un-à-plusieurs, ou un prédicat MANY-TO-MANY MERGE:() si l'opération exécute une jointure plusieurs-à-plusieurs. La colonne Argument inclut également une liste de colonnes séparées par des virgules utilisées pour exécuter l'opération. L'opérateur Merge Join nécessite deux entrées triées dans leurs colonnes respectives, peut-être par l'insertion d'opérations de tri explicites dans le plan de requête. L'opérateur Merge join est particulièrement efficace si le tri explicite n'est pas nécessaire, par exemple s'il existe un index B-tree approprié dans la base de données ou si l'ordre de tri peut être exploité pour plusieurs opérations, telles que jointure de fusion et regroupement par cumuls. Merge Join est un opérateur physique. |
|
Nested Loops |
L'opérateur Nested Loops réalise les opérations logiques Inner Join, Left Outer Join, Left Semi Join et Left Anti Semi Join. Les jointures Nested Loops effectuent une recherche sur la table interne pour chaque ligne de la table externe, généralement en utilisant un index. Le processeur de requêtes décide, sur la base de coûts anticipés, de trier ou non l'entrée externe pour améliorer la localisation des recherches dans l'index de l'entrée interne. Les lignes répondant au prédicat (facultatif) de la colonne Argument sont renvoyées (le cas échéant, sur la base de l'opération logique exécutée). Nested Loops est un opérateur physique. |
|
Nonclustered Index Delete |
L'opérateur Nonclustered Index Delete supprime des lignes d'entrée de l'index non-cluster spécifié dans la colonne Argument. Nonclustered Index Delete est un opérateur physique. |
|
Index Insert |
L'opérateur Index Insert insère des lignes de son entrée dans l'index non-cluster spécifié dans la colonne Argument. La colonne Argument contient également un prédicat SET:(), qui indique la valeur à laquelle chaque colonne est définie. Index Insert est un opérateur physique. |
|
Index Scan |
L'opérateur Index Scan récupère toutes les lignes de l'index non-cluster spécifié dans la colonne Argument. Si un prédicat WHERE:() facultatif figure dans la colonne Argument, seules les lignes répondant à ce prédicat sont retournées. Index Scan est un opérateur logique et physique. |
|
Index Seek |
L'opérateur Index Seek utilise la capacité de recherche dans les index pour extraire des lignes d'un index non-cluster. La colonne Argument contient le nom de l'index non-cluster utilisé. Il contient également le prédicat SEEK:(). Le moteur de stockage utilise l'index pour ne traiter que les lignes répondant au prédicat SEEK:(). Il peut éventuellement inclure un prédicat WHERE:() dans lequel le moteur de stockage est évalué par rapport à toutes les lignes répondant au prédicat SEEK:() ; il ne fait pas appel aux index pour exécuter ce processus. Si la colonne Argument contient la clause ORDERED, cela signifie que le processeur de requêtes a décidé que les lignes devaient être retournées dans l'ordre dans lequel l'index non-cluster les a triées. Si la clause ORDERED n'apparaît pas, le moteur de stockage recherche dans l'index de façon optimale (sans garantie de tri de la sortie). Autoriser la sortie à conserver son ordre peut s'avérer moins efficace que la production d'une sortie non triée. Index Seek est un opérateur logique et physique. |
|
Index spool |
L'opérateur physique Index Spool contient un prédicat SEEK:() dans la colonne Argument. L'opérateur Index Spool analyse ses lignes d'entrée en plaçant une copie de chaque ligne dans un fichier d'attente caché (stocké dans la base de données tempdb et qui n'existe que le temps de la requête) et construit un index non-cluster sur les lignes. Ceci vous permet d'utiliser les capacités de recherche des index afin de ne sortir que les lignes répondant au prédicat SEEK:(). Si l'opérateur est réutilisé (par un opérateur Nested Loops, par exemple) mais qu'aucune nouvelle liaison n'est nécessaire, les données mises en attente sont utilisées au lieu d'une nouvelle analyse de l'entrée. |
|
Nonclustered Index Update |
L'opérateur physique Nonclustered Index Update met à jour des lignes de son entrée dans l'index non-cluster spécifié dans la colonne Argument. Si un prédicat SET:() est présent, chaque colonne mise à jour prend cette valeur. Nonclustered Index Update est un opérateur physique. |
|
Online Index Insert |
L'opérateur physique Online Index Insert indique qu'une opération de création, modification ou suppression d'index est effectuée en ligne. Autrement dit, les données de la table sous-jacente restent disponibles aux utilisateurs pendant l'opération d'index. |
|
Aucune |
Parallelism |
L'opérateur Parallelism effectue les opérations logiques de distribution de flux, de collecte de flux, et de répartition de flux. La colonne Argument peut contenir un prédicat PARTITION COLUMNS:() avec la liste des colonnes de partitionnement séparées par des virgules. La colonne Argument peut également contenir un prédicat ORDER BY:(), qui liste les colonnes pour conserver l'ordre de tri durant le partitionnement. Parallelism est un opérateur physique.
|
Parameter Table Scan |
L'opérateur Parameter Table Scan analyse une table qui agit comme paramètre dans la requête en cours. Généralement, cet opérateur est utilisé dans une procédure stockée pour les requêtes INSERT. Parameter Table Scan est un opérateur logique et physique. |
|
Aucune |
Partial Aggregate |
Partial Aggregate est utilisé dans des plans parallèles. Il applique une fonction d'agrégation à autant de lignes d'entrée que possible, afin que l'écriture sur le disque (appelé « débordement ») ne soit pas nécessaire. Hash Match constitue l'unique opérateur physique (itérateur) qui implémente une agréation de partition. Partial Aggregate est un opérateur logique. |
Population Query |
L'opérateur Population Query permet de renseigner la table de travail d'un curseur lorsque le curseur est ouvert. |
|
Refresh Query |
L'opérateur Refresh Query extrait les données courantes des lignes du tampon d'extraction. |
|
Remote Delete |
L'opérateur Remote Delete supprime les lignes d'entrée d'un objet distant. Remote Delete est un opérateur logique et physique. |
|
Remote Index Scan |
L'opérateur Remote Index Scan analyse l'index distant spécifié dans la colonne Argument. Remote Index Scan est un opérateur logique et physique. |
|
Remote Index Seek |
L'opérateur Remote Index Seek utilise les capacités de recherche d'un objet d'index distant pour extraire des lignes. La colonne Argument contient le nom de l'index distant utilisé et le prédicat SEEK:(). Remote Index Seek est un opérateur physique logique. |
|
Remote Insert |
L'opérateur Remote Insert insère des lignes d'entrée dans un objet distant. Remote Insert est un opérateur logique et physique. |
|
Remote Query |
L'opérateur Remote Query soumet une requête à une source distante. Le texte de la requête envoyée au serveur distant apparaît dans la colonne Argument. Remote Query est un opérateur logique et physique. |
|
Remote Scan |
L'opérateur Remote Scan analyse un objet distant. Le nom de l'objet distant apparaît dans la colonne Argument. Remote Scan est un opérateur logique et physique. |
|
Remote Update |
L'opérateur Remote Update met à jour les lignes d'entrée dans un objet distant. Remote Update est un opérateur logique et physique. |
|
Repartition Streams |
L'opérateur Repartition Streams consomme plusieurs flux et produit plusieurs flux d'enregistrements. Le contenu et le format des enregistrements ne sont pas modifiés. Si l'optimiseur de requête utilise un filtre bitmap, le nombre de lignes dans le flux de sortie est réduit. Chaque enregistrement d'un flux d'entrée est placé dans un flux de sortie. Si l'opérateur conserve l'ordre de tri, tous les flux d'entrée seront classés et fusionnés en plusieurs flux de sortie triés. Si la sortie est partitionnée, la colonne Argument contient alors un prédicat PARTITION COLUMNS:() et les colonnes de partitionnement. Si la sortie est triée, la colonne Argument contient un prédicat ORDER BY:() et la colonne triée. Repartition Streams est un opérateur logique. Cet opérateur n'est utilisé que dans les plans de requête en parallèle. |
|
Result |
L'opérateur Result contient les données retournées à la fin d'un plan de requête. Il représente en général l'élément racine d'un plan d'exécution de requêtes. Result est un élément de langage. |
|
RID Lookup |
RID Lookup est une recherche de signet sur un segment utilisant un identificateur de ligne fourni (RID, Row Identifier). La colonne Argument contient l'étiquette de signet utilisée pour rechercher la ligne dans la table, ainsi que le nom de la table dans laquelle la ligne est recherchée. RID Lookup est toujours accompagné par un opérateur NESTED LOOP JOIN. RID Lookup est un opérateur physique. Pour plus d'informations sur les recherches de signets, consultez « Bookmark Lookup » (en anglais) sur le blog MSDN SQL Server. |
|
Aucune |
Right Anti Semi Join |
L'opérateur Right Anti Semi Join sort chaque ligne de la seconde entrée (en bas) lorsqu'il n'existe pas de ligne correspondante dans la première entrée (en haut). Une ligne correspondante se définit comme une ligne répondant au prédicat de la colonne Argument (s'il n'y a pas de prédicat, chaque ligne est une ligne correspondante). Right Anti Semi Join est un opérateur logique. |
Aucune |
Right Outer Join |
L'opérateur Right Outer Join retourne chaque ligne répondant à la condition de jointure de la seconde entrée (du bas) avec chaque ligne correspondante dans la première entrée (du haut). Il retourne également toutes les lignes de la seconde entrée qui n'ont pas de lignes correspondantes dans la première entrée, reliées par la valeur NULL. Si aucun prédicat de jointure n'est présent dans la colonne Argument, chaque ligne est une ligne correspondante. Right Outer Join est un opérateur logique. |
Aucune |
Right Semi Join |
L'opérateur Right Semi Join renvoie chaque ligne de la seconde entrée (du bas) s'il n'y a pas de ligne correspondante dans la première entrée (du haut). Si aucun prédicat de jointure n'est présent dans la colonne Argument, chaque ligne est une ligne correspondante. Right Semi Join est un opérateur logique. |
Row Count Spool |
L'opérateur Row Count Spool analyse l'entrée en comptant le nombre de lignes présentes et en retournant ce même nombre de lignes exemptes de données. Cet opérateur est utilisé lorsqu'il est plus important de vérifier l'existence des lignes que les données qu'elles contiennent. Par exemple, si un opérateur Nested Loops exécute une opération Left Semi Joint et que le prédicat de jointure s'applique à l'entrée interne, un spool du nombre de lignes peut être placé en haut de l'entrée interne de l'opérateur Nested Loops. Ce dernier peut alors déterminer le nombre de lignes sorties par le spool du nombre de lignes (car les données réelles de la partie interne ne sont pas indispensables) afin de déterminer s'il retourne ou non la ligne externe. Row Count Spool est un opérateur physique. |
|
Segment |
Segment est un opérateur logique et physique. Il divise le jeu de données d'entrée en segments en fonction de la valeur d'une ou plusieurs colonnes. Ces colonnes apparaissent en tant qu'arguments dans l'opérateur Segment. L'opérateur génère ensuite un segment à la fois. |
|
Aucune |
Segment Repartition |
Dans un plan de requête parallèle, il existe parfois des régions conceptuelles composées d'itérateurs. Tous les itérateurs de ces régions peuvent être exécutés par des threads parallèles. Les régions elles-mêmes doivent être exécutées séquentiellement. Certains itérateurs Parallelism d'une région distincte sont appelés Branch Repartition. L'itérateur Parallelism situé à la limite de deux régions de ce type est appelé Segment Repartition. Branch Repartition et Segment Repartition sont des opérateurs logiques. |
Sequence |
L'opérateur Sequence gère des plans de mise à jour étendus. Il exécute, sur le plan fonctionnel, chaque entrée en séquence (de haut en bas). Chaque entrée est généralement une mise à jour d'un objet différent. Il ne retourne que les lignes provenant de sa dernière entrée (du bas). Sequence est un opérateur logique et physique. |
|
Sequence Project |
L'opérateur Sequence Project ajoute des colonnes pour effectuer des calculs sur un jeu ordonné. Il divise le jeu d'entrée en segments en fonction de la valeur d'une ou plusieurs colonnes. L'opérateur génère ensuite un segment à la fois. Ces colonnes s'affichent en tant qu'arguments dans l'opérateur Sequence Project. Sequence Project est un opérateur logique et physique. |
|
Snapshot |
L'opérateur Snapshot crée un curseur qui ne voit pas les modifications apportées par les autres. |
|
Sort |
L'opérateur Sort trie toutes les lignes entrantes. La colonne Argument contient soit un prédicat DISTINCT ORDER BY:() si les doublons sont supprimés par cette opération, soit un prédicat ORDER BY:() accompagné de la liste des colonnes à trier séparées par des virgules. Les colonnes comportent le préfixe ASC si elles sont triées dans l'ordre ascendant, ou DESC si elles sont triées dans l'ordre descendant. Sort est un opérateur logique et physique. |
|
Split |
L'opérateur Split est utilisé pour optimiser le traitement des mises à jour. Il divise chaque opération de mise à jour en opérations DELETE et INSERT. L'opérateur Split est un opérateur logique et physique. |
|
Spool |
L'opérateur Spool enregistre un résultat de requête intermédiaire dans la base de données tempdb. |
|
Stream Aggregate |
L'opérateur Stream Aggregate effectue un regroupement d'après une ou plusieurs colonnes et calcule une ou plusieurs expressions d'agrégation retournées par la requête. La sortie de cet opérateur peut être référencée par des opérateurs ultérieurs dans la requête, retournés au client, ou les deux. L'opérateur Stream Aggregate exige que l'entrée suive l'ordre des colonnes dans ses groupes. L'optimiseur utilise un opérateur Sort avant cet opérateur si les données ne sont pas déjà triées en raison d'un opérateur Sort précédent ou d'une recherche ou d'une analyse d'index triée. Dans l'instruction SHOWPLAN_ALL ou dans le plan d'exécution de requête graphique de SQL Server Management Studio, les colonnes du prédicat GROUP BY sont répertoriées dans la colonne Argument, et les expressions d'agrégation sont répertoriées dans la colonne Defined Values. Stream Aggregate est un opérateur physique. |
|
Switch |
Switch est un type particulier d'itérateur de concaténation qui a n entrées. Une expression est associée à chaque opérateur Switch. Selon la valeur renvoyée par l'expression (entre 0 et n-1), Switch copie le flux d'entrée approprié dans le flux de sortie. L'une des utilisations de Switch consiste à implémenter des plans de requête impliquant des curseurs à avance rapide avec certains opérateurs tels que l'opérateur TOP. Switch est un opérateur logique et physique. |
|
Table Delete |
L'opérateur physique Table Delete supprime les lignes de la table spécifiée dans la colonne Argument du plan d'exécution de requête. |
|
Table Insert |
L'opérateur Table Insert insère les lignes de son entrée dans la table spécifiée dans la colonne Argument du plan d'exécution de requête. La colonne Argument contient également un prédicat SET:(), qui indique la valeur à laquelle chaque colonne est définie. Si Table Insert ne possède pas d'enfant pour les valeurs insert, la ligne insérée est extraite de l'opérateur Insert lui-même. Table Insert est un opérateur physique. |
|
Table Merge |
L'opérateur Table Merge applique un flux de données de fusion à un tas. L'opérateur supprime, met à jour ou insère des lignes dans la table spécifiée dans la colonne Argument de l'opérateur. L'opération réellement effectuée dépend de la valeur d'exécution de la colonne ACTION spécifiée dans la colonne Argument de l'opérateur. Table Merge est un opérateur physique. |
|
Table Scan |
L'opérateur Table Scan extrait toutes les lignes de la table spécifiée dans la colonne Argument du plan d'exécution de requête. Si un prédicat WHERE:() figure dans la colonne Argument, seules les lignes répondant à ce prédicat sont retournées. Table Scan est un opérateur logique et physique. |
|
Table Spool |
L'opérateur Table Spool analyse l'entrée et place une copie de chaque ligne dans une table d'attente cachée, qui est stockée dans la base de données tempdb et qui n'existe que le temps de la requête. Si l'opérateur est réutilisé (par un opérateur Nested Loops, par exemple) mais qu'aucune nouvelle liaison n'est nécessaire, les données mises en attente sont utilisées au lieu d'une nouvelle analyse de l'entrée. Table Spool est un opérateur physique. |
|
Table Update |
L'opérateur physique Table Update met à jour les lignes d'entrée de la table spécifiée dans la colonne Argument du plan d'exécution de requête. Le prédicat SET:() détermine la valeur de chaque colonne mise à jour. Ces valeurs peuvent être référencées dans la clause SET ou ailleurs dans cet opérateur et ailleurs dans cette requête. |
|
Fonction table |
L'opérateur Table-valued Function évalue une fonction table (Transact-SQL ou CLR) et stocke les lignes obtenues dans la base de données tempdb. Lorsque les itérateurs parents demandent les lignes, Fonction table envoie les lignes à partir de tempdb. Les requêtes avec des appels à des fonctions table génèrent des plans de requêtes avec l'itérateur Table-valued Function. La fonction table peut être évaluée avec différentes valeurs de paramètres :
Table-valued Function est un opérateur logique et physique. |
|
Top |
L'opérateur Top analyse l'entrée et retourne uniquement le premier nombre ou pourcentage spécifié de lignes, éventuellement en fonction d'un ordre de tri. La colonne Argument peut contenir la liste des colonnes dont les liaisons sont vérifiées. Dans les plans de mise à jour, l'opérateur Top renforce les limites du nombre de lignes. Top est un opérateur logique et physique. Top est un opérateur logique et physique. |
|
Aucune |
Top N Sort |
L'itérateur Top N Sort est similaire à l'itérateur Sort, à la différence que seules les N premières lignes sont requises, et non pas la totalité du jeu de résultats. Pour de petites valeurs de N, le moteur d'exécution de requête de SQL Server essaie de réaliser en mémoire la totalité de l'opération de tri. Pour des valeurs élevées de N, le moteur d'exécution de requête recourt à la méthode de tri plus générique, dans laquelle N n'est pas un paramètre. |
UDX |
Les opérateurs UDX (Extended Operators) implémentent l'une des nombreuses opérations XQuery et XPath dans SQL Server. Tous les opérateurs UDX sont des opérateurs logiques et physiques. L'opérateur UDX FOR XML est utilisé pour sérialiser l'ensemble de lignes relationnelles qu'il entre dans une représentation XML dans une colonne BLOB dans une ligne de sortie. Il s'agit d'un opérateur d'agrégation XML qui tient compte de l'ordre. L'opérateur UDX XML SERIALIZER est un opérateur d'agrégation XML qui tient compte de l'ordre. Il entre des lignes qui représentent des nœuds XML ou des valeurs scalaires XQuery dans un ordre de document XML et produit un objet BLOB XML sérialisé dans une colonne XML dans une ligne de sortie. L'opérateur UDX XML FRAGMENT SERIALIZER est un type de XML SERIALIZER qui permet de traiter les lignes d'entrée représentant les fragments XML à insérer dans l'extension de modification de données d'insertion XQuery. L'opérateur UDX XQUERY STRING évalue la valeur de la chaîne XQuery des lignes d'entrée représentant des nœuds XML. Il s'agit d'un opérateur d'agrégation de chaîne qui tient compte de l'ordre. Il produit une ligne avec des colonnes représentant la valeur scalaire XQuery qui contient la valeur de chaîne de l'entrée. L'opérateur UDX XQUERY LIST DECOMPOSER est un opérateur de décomposition de liste XQuery. Pour chaque ligne d'entrée représentant un nœud XML, il produit une ou plusieurs lignes représentant chacune une valeur scalaire contenant une valeur d'élément de liste si le type d'entrée est une liste XSD. L'opérateur UDX XQUERY DATA évalue la fonction XQuery fn:data() dans l'entrée représentant des nœuds XML. Il s'agit d'un opérateur d'agrégation de chaîne qui tient compte de l'ordre. Il produit une ligne avec des colonnes représentant la valeur scalaire XQuery qui contient le résultat de fn:data(). L'opérateur UDX XQUERY CONTAINS évalue la fonction XQuery fn:contains() dans l'entrée représentant des nœuds XML. Il s'agit d'un opérateur d'agrégation de chaîne qui tient compte de l'ordre. Il produit une ligne avec des colonnes représentant la valeur scalaire XQuery qui contient le résultat de fn:contains(). L'opérateur UDX UPDATE XML NODE met à jour un nœud XML dans l'extension de modification de données de remplacement XQuery dans la méthode modify() dans le type XML. |
|
Aucune |
Union |
L'opérateur Union analyse plusieurs entrées en sortant chaque ligne analysée et en supprimant les doublons. Union est un opérateur logique. |
Update |
L'opérateur Update met à jour chaque ligne de son entrée dans l'objet spécifié dans la colonne Argument du plan d'exécution de requête. Update est un opérateur logique. L'opérateur physique est Table Update, Index Update ou Clustered Index Update. |
|
While |
L'opérateur While implémente la boucle WHILE Transact-SQL. While est un élément de langage. |
|
Window Spool |
L'opérateur Window Spool développe chaque ligne dans un ensemble de lignes qui représente la fenêtre qui lui est associée. Dans une requête, la clause OVER définit la fenêtre dans un jeu de résultats de la requête et une fonction de fenêtre calcule ensuite une valeur pour chaque ligne de la fenêtre. Window Spool est un opérateur logique et physique. |