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
JOIN
doit toujours suivre immédiatement la clauseFROM
. - Vous pouvez préfixer le
JOIN
avec le type de jointure.INNER
ouLEFT
est facultatif et la valeur par défaut estINNER
lorsqu'il est omis. - Les parenthèses contenant une sous-requête doivent immédiatement suivre la clause
JOIN
. - La clause
ON
doit 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 JOIN
dans 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, errorClass
L'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
LIMIT
de 10, avec un maximumLIMIT
de 5 000. Notez que leLIMIT
de la requête externe n'affecte pas la requête interne. - L'utilisation de
TIMESERIES
dans 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 WITH
dans 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
ON
prend uniquement en charge les conditions d’égalité. - La clé
JOIN
ne 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 conditionON
deJOIN
doit ê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
ON
deJOIN
- La sous-requête ne peut pas être une requête métrique par ligne.
- Le côté droit de la condition ON du
JOIN
doit ê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 :