

Amazon Timestream for LiveAnalytics に類似した機能をご希望の場合は Amazon Timestream for InfluxDB をご検討ください。リアルタイム分析に適した、シンプルなデータインジェストと 1 桁ミリ秒のクエリ応答時間を特徴としています。詳細については、[こちら](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 各デバイスからの最終ポイント
<a name="scheduledqueries-patterns-lastpointfromdevice"></a>

アプリケーションで、デバイスによって最後に発行された測定値の読み取りが必要になる場合があります。より一般的なユースケースとして、特定の日付/時刻より前におけるデバイスの最後の測定値や、特定の日付/時刻より後におけるデバイスの最初の測定値を取得する場合もあります。数百万のデバイスと数年分のデータがある場合、この検索では大量のデータのスキャンが必要になる可能性があります。

以下は、スケジュールされたクエリを使用して、デバイスによって発行された最終ポイントの検索を最適化する方法の例です。アプリケーションで必要とされる場合は、同じパターンを使用して最初のポイントのクエリも最適化できます。

**Topics**
+ [ソーステーブルからの計算](#scheduledqueries-patterns-lastpointfromdevice-computedfromsrctable)
+ [日単位の詳細度で事前計算する派生テーブル](#scheduledqueries-patterns-lastpointfromdevice-derivedttabletoprecompute)
+ [派生テーブルからの計算](#scheduledqueries-patterns-lastpointfromdevice-computedfromderivedtable)
+ [ソーステーブルと派生テーブルの組み合わせ](#scheduledqueries-patterns-lastpointfromdevice-combinesourceandderived)

## ソーステーブルからの計算
<a name="scheduledqueries-patterns-lastpointfromdevice-computedfromsrctable"></a>

以下は、特定のデプロイ内のサービス (例: 特定の region、cell、silo、availability\$1zone 内に存在する特定のマイクロサービスのサーバー) によって発行される最後の測定値を検索するクエリの例です。サンプルアプリケーションでは、このクエリは数百のサーバーにおける最後の測定値を返します。また、このクエリは無制限の時間述語を持ち、指定されたタイムスタンプより古いすべてのデータを検索します。

**注記**  
`max` および `max_by` 関数の詳細については、「[集計関数](aggregate-functions.md)」を参照してください。

```
SELECT instance_name, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure
FROM "raw_data"."devops"
WHERE time < from_milliseconds(1636685271872)
    AND measure_name = 'events'
    AND region = 'us-east-1'
    AND cell = 'us-east-1-cell-10'
    AND silo = 'us-east-1-cell-10-silo-3'
    AND availability_zone = 'us-east-1-1'
    AND microservice_name = 'hercules'
GROUP BY region, cell, silo, availability_zone, microservice_name,
    instance_name, process_name, jdk_version
ORDER BY instance_name, time DESC
```

## 日単位の詳細度で事前計算する派生テーブル
<a name="scheduledqueries-patterns-lastpointfromdevice-derivedttabletoprecompute"></a>

上記のユースケースをスケジュールされた計算に変換できます。アプリケーションの要件により、複数のリージョン、セル、サイロ、アベイラビリティーゾーン、マイクロサービスにわたってフリート全体でこれらの値を取得する必要がある場合は、1 つのスケジュール計算を使用してフリート全体の値を事前計算できます。これは、Timestream for LiveAnalytics のサーバーレスなスケジュールされたクエリの強みであり、これらのクエリをアプリケーションのスケーリング要件に合わせてスケールできます。

以下は、特定の日におけるすべてのサーバーの最終ポイントを事前計算するためのクエリです。クエリには時間述語のみがあり、ディメンションの述語はありません。時間述語により、指定されたスケジュール式に基づいて計算がトリガーされた時点からの過去 1 日にクエリが制限されます。

```
SELECT region, cell, silo, availability_zone, microservice_name, 
    instance_name, process_name, jdk_version, 
    MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure 
FROM raw_data.devops 
WHERE time BETWEEN bin(@scheduled_runtime, 1d) - 1d AND bin(@scheduled_runtime, 1d) 
    AND measure_name = 'events' 
GROUP BY region, cell, silo, availability_zone, microservice_name, 
    instance_name, process_name, jdk_version
```

以下は、上のクエリを使用するスケジュールされた計算の設定です。このクエリは毎日 UTC の 01:00 に実行され、過去 1 日の集計が計算されます。スケジュール式 cron(0 1 \$1 \$1 ? \$1) はこの動作を制御し、1 日が終了してから 1 時間後に実行され、最大 1 日遅れて到着するデータを織り込みます。

```
{
    "Name": "PT1DPerInstanceLastpoint",
    "QueryString": "SELECT region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1d) - 1d AND bin(@scheduled_runtime, 1d) AND measure_name = 'events' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version",
    "ScheduleConfiguration": {
        "ScheduleExpression": "cron(0 1 * * ? *)"
    },
    "NotificationConfiguration": {
        "SnsConfiguration": {
            "TopicArn": "******"
        }
    },
    "TargetConfiguration": {
        "TimestreamConfiguration": {
            "DatabaseName": "derived",
            "TableName": "per_timeseries_lastpoint_pt1d",
            "TimeColumn": "time",
            "DimensionMappings": [
                {
                    "Name": "region",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "cell",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "silo",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "availability_zone",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "microservice_name",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "instance_name",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "process_name",
                    "DimensionValueType": "VARCHAR"
                },
                {
                    "Name": "jdk_version",
                    "DimensionValueType": "VARCHAR"
                }
            ],
            "MultiMeasureMappings": {
                "TargetMultiMeasureName": "last_measure",
                "MultiMeasureAttributeMappings": [
                    {
                        "SourceColumn": "last_measure",
                        "MeasureValueType": "DOUBLE"
                    }
                ]
            }
        }
    },
    "ErrorReportConfiguration": {
        "S3Configuration" : {
            "BucketName" : "******",
            "ObjectKeyPrefix": "errors",
            "EncryptionOption": "SSE_S3"
        }
    },
    "ScheduledQueryExecutionRoleArn": "******"
}
```

## 派生テーブルからの計算
<a name="scheduledqueries-patterns-lastpointfromdevice-computedfromderivedtable"></a>

上の設定を使用して派生テーブルを定義し、スケジュールされたクエリの少なくとも 1 つのインスタンスでデータが派生テーブルにマテリアライズされたら、派生テーブルのクエリによって最新の測定値を取得できます。以下は、派生テーブルに対するクエリの例です。

```
SELECT instance_name, MAX(time) AS time, MAX_BY(last_measure, time) AS last_measure
FROM "derived"."per_timeseries_lastpoint_pt1d"
WHERE time < from_milliseconds(1636746715649)
    AND measure_name = 'last_measure'
    AND region = 'us-east-1'
    AND cell = 'us-east-1-cell-10'
    AND silo = 'us-east-1-cell-10-silo-3'
    AND availability_zone = 'us-east-1-1'
    AND microservice_name = 'hercules'
GROUP BY region, cell, silo, availability_zone, microservice_name,
    instance_name, process_name, jdk_version
ORDER BY instance_name, time DESC
```

## ソーステーブルと派生テーブルの組み合わせ
<a name="scheduledqueries-patterns-lastpointfromdevice-combinesourceandderived"></a>

前の例と同様に、派生テーブルのデータに最新の書き込みはありません。したがって、先ほどと同様のパターンを再度使用して、古いデータについては派生テーブルのデータをマージし、残りのデータについてはソースデータを使用できます。以下は、同様の UNION アプローチを使用したこのようなクエリの例です。アプリケーションの要件により、ある期間より前の最新の測定値を見つける必要があり、この開始時刻は過去である可能性があるため、このクエリを記述する際には指定された時刻と指定された時刻から最大 1 日前のソースデータを使用し、古いデータには派生テーブルを使用します。以下のクエリの例からわかるように、ソースデータの時間述語には制限があります。これにより、データ量が大幅に多いソーステーブルでの処理が効率化され、派生テーブルでは無制限の時間述語が使用されます。

```
WITH last_point_derived AS (
    SELECT instance_name, MAX(time) AS time, MAX_BY(last_measure, time) AS last_measure
    FROM "derived"."per_timeseries_lastpoint_pt1d"
    WHERE time < from_milliseconds(1636746715649)
        AND measure_name = 'last_measure'
        AND region = 'us-east-1'
        AND cell = 'us-east-1-cell-10'
        AND silo = 'us-east-1-cell-10-silo-3'
        AND availability_zone = 'us-east-1-1'
        AND microservice_name = 'hercules'
    GROUP BY region, cell, silo, availability_zone, microservice_name,
        instance_name, process_name, jdk_version
), last_point_source AS (
    SELECT instance_name, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure
    FROM "raw_data"."devops"
    WHERE time < from_milliseconds(1636746715649) AND time > from_milliseconds(1636746715649) - 26h
        AND measure_name = 'events'
        AND region = 'us-east-1'
        AND cell = 'us-east-1-cell-10'
        AND silo = 'us-east-1-cell-10-silo-3'
        AND availability_zone = 'us-east-1-1'
        AND microservice_name = 'hercules'
    GROUP BY region, cell, silo, availability_zone, microservice_name,
        instance_name, process_name, jdk_version
)
SELECT instance_name, MAX(time) AS time, MAX_BY(last_measure, time) AS last_measure
FROM (
    SELECT * FROM last_point_derived
    UNION
    SELECT * FROM last_point_source
)
GROUP BY instance_name
ORDER BY instance_name, time DESC
```

上は、派生テーブルの構築方法の一例にすぎません。何年分ものデータがある場合は、集計のレベルを増やすことができます。例えば、日次集計に加えて月次集計や毎時の集計が可能です。つまり、直近 1 時間の最新データ、直近 1 日の毎時のデータ、過去 1 か月の 1 日ごとのデータ、それより古い月ごとのデータをマージできます。設定するレベルの数と更新スケジュールは、これらのクエリの発行頻度と、これらのクエリを同時に発行するユーザーの数の要件に応じて決定されます。