NRQLを使用すると、別のクエリ内にネストされたクエリであるサブクエリを実行できます。
サブクエリの基本
サブクエリは、別のクエリ内にネストされたクエリです。サブクエリを使用すると、あるクエリの結果を別のクエリで使用できます。サブクエリで実行できることの例:
- 親エンティティの子エンティティで計算を実行します
- インフラストラクチャエージェントのCPU使用率に基づいて、CPU負荷が高いホストのエラーログを参照してください
NRQL では、 SELECT
ステートメントとWHERE
句でサブクエリを使用できます。
サブクエリの例
平均以上の期間のトランザクションの数を取得するためのクエリの例を次に示します。
SELECT count(*) FROM Transaction WHERE duration > (SELECT average(duration) FROM Transaction)
サブクエリの結果は、コンテキストで意味をなす必要があります。上記の例では、 WHERE
句の大なり条件には、単一の値を返すサブクエリが必要です。一連の値を返すサブクエリ ( uniques()
サブクエリなど) は失敗します。
サブクエリは、別のサブクエリ内にネストできます。クエリでは、ネストされているかどうかに関係なく、最大3つのサブクエリを使用できます。
サブクエリの時間範囲は、 SINCE
/ UNTIL
で明示的に指定されていない限り、外側のクエリと同じになります。ダッシュボードで、 タイム ピッカーからウィンドウを選択すると、サブクエリの時間範囲が外部クエリの時間範囲に合わせられます。そのグラフに [時間ピッカーを無視]を設定した場合、サブクエリの時間範囲と外部クエリの時間範囲は同じではありません。
サブクエリの実行
クエリの実行中、各サブクエリは独立して実行され、その結果は外部クエリで定数値または値のセットとして使用されます。この実行モデルにより、サブクエリは外部クエリの属性と値を参照しない場合があります。
クエリ期間の制限は、サブクエリを含むクエリに対して適用されます。これは、すべてのサブクエリと外部クエリが期間制限内に実行を完了する必要があることを意味します。
サブクエリが返すことができる結果の最大数は、 LIMIT MAX
の値と同じ : 2,000 です。その制限を超えると、結果が不完全になり、次のエラー メッセージが表示される場合があります。
サブクエリとネストされた集計
サブクエリは似ているように見えますが、ネストされたクエリの結果を集計できるネストされた集計と混同しないでください。ネストされた集計はFROM
句で使用され、サブクエリはSELECT
ステートメントとWHERE
句で使用されます。
制限
- サブクエリは、NRQLアラート条件ではサポートされていません。サブクエリを使用するクエリでは、データに対して複数のパスを作成する必要があるため、サブクエリはストリーミングアラートと互換性がありません。
- クエリが複数の結果セットを返す原因となる
TIMESERIES
句とCOMPARE WITH
句は、サブクエリではサポートされていません。 - サブクエリは
FACET
句には表示できませんが、 FACET CASES
で使用されるWHERE
句には表示できます。 - 結果の数に制限があります
サブクエリの例
サブクエリの例を次に示します。
アグリゲーターaverage()
、 count()
、 uniqueCount()
、またはlatest()
を使用するクエリなど、単一の数値を返すクエリはすべて、数値条件で使用できます。
期間が平均よりも長かったトランザクションの数を見つけます。
FROM Transaction SELECT count(*)
WHERE duration > (FROM Transaction SELECT average(duration))
uniques()
を使用するクエリを含め、値のセットを返すクエリはすべて、 IN
条件で使用できます。
特定のエンティティの子であるトランザクションの平均期間を計算します。
FROM Transaction SELECT average(duration) WHERE entityGuid IN
(FROM Relationship SELECT targetEntityGuid
WHERE sourceEntityGuid = 'MjUyMDUyOHxOUjF8V09SS0xPQUR8NzYzMDQ'
AND relationshipType = 'CONTAINS')
ファセットサブクエリで比較演算子( =
、 !=
、 <
など)を使用する場合、結果を単一の値に制限するには、 LIMIT 1
を指定する必要があります。
平均トランザクション期間が最も長いアカウントの最新のトランザクションに関連するトランザクションエラーを検索します。
FROM TransactionError SELECT * WHERE guid = (FROM Transaction SELECT latest(guid) FACET accountId ORDER BY average(duration) LIMIT 1)
サブクエリの結果は、 SELECT
ステートメントの計算に使用できます。サブクエリは、外部クエリとは異なる時間範囲を指定する場合があります。
現在の平均トランザクション期間と先週の平均期間の差をグラフ化します。
FROM Transaction SELECT average(duration) -
(FROM Transaction SELECT average(duration)
SINCE 7 days ago) TIMESERIES
1つのクエリに最大3つのサブクエリが表示される場合があります。
期間が99パーセンタイルを超えたトランザクションを担当する一意のアカウントを見つけます。
FROM Transaction SELECT uniques(accountId) WHERE guid IN
(FROM Transaction SELECT uniques(guid) WHERE duration >
(FROM Transaction SELECT percentile(duration, 99)))
多くのNRQL関数は、引数としてサブクエリを取ることができます。
平均と比較した個々のトランザクション期間を示す文字列を作成します。
SELECT concat('This transaction duration: ', duration, '; average transaction duration: ',
(SELECT average(duration) FROM Transaction), precision: 4) FROM Transaction