Une grande partie des données stockées dans New Relic se rapportent à d'autres données : Transaction et TransactionError, PageView et PageAction, Log et événement infrastructure , et plus encore. Vous pouvez effectuer des analyses et calculer des corrélations entre ces événements à l'aide de jointures de sous-requêtes.
Comment écrire une jointure de sous-requête
Une sous-requête est une requête imbriquée dans une autre requête. Avec les jointures de sous-requêtes, vous pouvez combiner le résultat d'une sous-requête avec le résultat de sa requête externe en fonction d'une clé, permettant ainsi l'analyse et l'enrichissement des ensembles de données.
Une jointure de sous-requête nécessite trois composants : deux ensembles de données et une clé primaire pour les lier ensemble.
FROM Event [INNER|LEFT] JOIN (subquery) ON [key =] key SELECT ...Les jointures de sous-requêtes contiennent des règles simples concernant la syntaxe :
- La clause
JOINdoit toujours suivre immédiatement la clauseFROM. - Vous pouvez préfixer le
JOINavec le type de jointure.INNERouLEFTest facultatif et la valeur par défaut estINNERlorsqu'il est omis. - Les parenthèses contenant une sous-requête doivent immédiatement suivre la clause
JOIN. - La clause
ONdoit suivre immédiatement la sous-requête et a deux formes (plus de détails ci-dessous).
Vous pouvez également avoir plusieurs clauses JOIN dans une requête. Par exemple, cette requête utilise deux JOINdans les sous-requêtes :
FROM JavaScriptError JOIN ( FROM PageAction JOIN ( FROM PageView SELECT count(*) FACET session AS pageViewSession, city LIMIT MAX ) ON session = pageViewSession SELECT count(*) FACET city, currentUrl, session AS pageActionSession ) ON session = pageActionSessionSELECT count(*) FACET city, currentUrl, session, errorClassL'image ci-dessous contient deux ensembles de données : le pourcentage moyen de CPU du conteneur infrastructure (ProcessSample) et la durée moyenne des transactions d'application par conteneur.

Souvent, les données provenant de différentes sources sont corrélées. Dans ce cas, vous pouvez déterminer si l'utilisation plus élevée du processeur d'un conteneur entraîne des transactions plus lentes en utilisant la jointure de sous-requête suivante :
FROM Transaction JOIN (FROM ProcessSample SELECT average(cpuPercent) AS cpu FACET containerId LIMIT MAX) ON containerIdSELECT average(duration)/latest(cpu) FACET containerId, containerName
Avec cette requête, vous pouvez voir les conteneurs qui ont une durée de transaction moyenne plus élevée compte tenu de leur utilisation CPU, et étudier la valeur hors norme pour voir s'il y a un bug à corriger ou des optimisations à faire.
Limitations de jointure de sous-requête
Les jointures de sous-requêtes présentent les limitations suivantes :
- La sous-requête jointe continuera d'avoir une valeur par défaut
LIMITde 10, avec un maximumLIMITde 5 000. Notez que leLIMITde la requête externe n'affecte pas la requête interne. - L'utilisation de
TIMESERIESdans la sous-requête jointe n'est pas prise en charge. Si votre requête externe utiliseTIMESERIES, gardez à l'esprit que la sous-requête jointe fournira un seul résultat pour toute la durée de la requête. - L'utilisation de
COMPARE WITHdans la sous-requête jointe n'est pas prise en charge. Si votre requête externe utiliseCOMPARE WITH, gardez à l'esprit que la sous-requête jointe fournira un résultat unique basé sur la durée de base de la requête et ne fournira pas de valeur distincte pour la requête externe par rapport à la durée. - Comme toutes les sous-requêtes, les sous-requêtes jointes ne peuvent pas être utilisées en condition d'alerte.
- Bien que
SELECT *soit pris en charge dans la requête parent, il n'est pas pris en charge dans la sous-requête jointe. - La cardinalité de la jointure est limitée à 1 : 100, ce qui signifie qu'une seule clé de jointure ne peut pas correspondre à plus de cent lignes dans le résultat de la sous-requête.
- La clause
ONprend uniquement en charge les conditions d’égalité. - La clé
JOINne peut pas être un attribut complexe, comme une valeur métrique. - Nous n'effectuons aucune contrainte sur les types d'attributs dans la condition
JOIN. Le côté gauche de la conditionONdeJOINdoit être du même type que le côté droit de la conditionON. - les caractères génériques métriques ne sont pas pris en charge dans la condition
ONdeJOIN - La sous-requête ne peut pas être une requête métrique par ligne.
- Le côté droit de la condition
ONdeJOINdoit être un identifiant projeté par la requête. Il ne peut pas utiliser de fonction ou d’opération mathématique. - La sous-requête jointe ne peut pas projeter un résultat
uniques().
Exemples de jointure de sous-requête
Voici quelques exemples de jointures de sous-requêtes :



