Avec NRQL, vous pouvez exécuter un subquery, qui est une requête imbriquée dans une autre requête. Une sous-requête est une requête imbriquée dans une autre requête : elle vous permet d'utiliser le résultat d'une requête dans une autre requête. Avec les sous-requêtes, vous pouvez :
- Effectuer des calculs sur l'entité enfant d'une entité mère
- Consultez les logs des erreurs pour les hôtes avec une charge CPU élevée en fonction de l'utilisation du processeur de l'agent infrastructure
Dans NRQL, les sous-requêtes peuvent apparaître dans l'instruction SELECT
et la clause WHERE
.
Voici un exemple de requête permettant d'obtenir le nombre de transactions ayant une durée supérieure à la moyenne :
SELECT count(*) FROM Transaction WHERE duration > (SELECT average(duration) FROM Transaction)
Les résultats d’une sous-requête doivent avoir du sens dans le contexte. Dans l'exemple ci-dessus, la condition supérieure à dans la clause WHERE
nécessite une sous-requête qui renvoie une valeur unique. Une sous-requête qui renvoie un ensemble de valeurs (par exemple une sous-requête uniques()
) échouerait.
Vous pouvez également imbriquer une sous-requête dans une autre sous-requête. NRQL autorise un maximum de trois sous-requêtes, imbriquées ou non, dans une seule requête.
La plage horaire de la sous-requête sera la même que celle de la requête externe, sauf spécification explicite avec SINCE
/UNTIL
. Dans un dashboard, le choix d'une fenêtre à partir du sélecteur d'intervalle de temps aligne la plage horaire de la sous-requête avec celle de la requête externe. Si vous avez défini Ignore Time Picker pour ce graphique, la plage horaire de la sous-requête et la plage horaire de la requête externe ne seront pas les mêmes.
Exécution de sous-requête
Lors de l'exécution de la requête, chaque sous-requête s'exécute indépendamment et son résultat est utilisé comme valeur constante ou ensemble de valeurs dans la requête externe. En raison de ce modèle d'exécution, les sous-requêtes ne peuvent pas référencer les attributs et les valeurs de la requête externe.
La limite de durée de requête est respectée pour les requêtes avec sous-requêtes. Cela signifie que toutes les sous-requêtes et la requête externe doivent terminer leur exécution dans la limite de durée.
Le nombre maximal de résultats qu'une sous-requête peut renvoyer est le même que la valeurLIMIT MAX
: 5 000. Lorsque cette limite est dépassée, cela peut entraîner des résultats incomplets et ce message d'erreur : « La sous-requête a peut-être atteint la limite maximale de membres de résultats, ce qui peut entraîner un résultat incomplet. »
Sous-requêtes et agrégation imbriquée
Bien qu'elles semblent similaires, les sous-requêtes sont différentes des agrégations imbriquées, qui permettent l'agrégation du résultat d'une requête imbriquée. Les agrégations imbriquées sont utilisées dans la clause FROM
, tandis que les sous-requêtes sont utilisées dans l'instruction SELECT
et la clause WHERE
.
Limites
- Les sous-requêtes ne sont pas prises en charge dans les règles NRQL condition d'alerte ou événement to métriques (E2M). Étant donné que les requêtes avec sous-requêtes nécessitent d'effectuer plusieurs passages sur les données, les sous-requêtes sont incompatibles avec les alertes en streaming ou d'autres produits basés sur le traitement en streaming des données.
- Les clauses
TIMESERIES
etCOMPARE WITH
, qui obligent la requête à renvoyer plusieurs ensembles de résultats, ne sont pas prises en charge dans les sous-requêtes. - Les sous-requêtes ne peuvent pas apparaître dans la clause
FACET
, bien qu'elles puissent apparaître dans les clausesWHERE
utilisées dansFACET CASES
. - A des limites sur le nombre de résultats
Exemples de sous-requêtes
Voici quelques exemples de sous-requêtes :