

如需與 Amazon Timestream for LiveAnalytics 類似的功能，請考慮使用 Amazon Timestream for InfluxDB。它提供簡化的資料擷取和單一位數毫秒查詢回應時間，以進行即時分析。[在這裡](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>

以下是查詢範例，以尋找特定部署中 服務發出的最後一個測量 （例如，指定區域內指定微服務、儲存格、孤島和 availability\_zone 的伺服器）。在範例應用程式中，此查詢會傳回數百個伺服器的上次測量。另請注意，此查詢具有無限制的時間述詞，並尋找任何早於指定時間戳記的資料。

**注意**  
如需 `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>

您可以將上述使用案例轉換為排定的運算。如果您的應用程式需求使得您可能需要跨多個區域、儲存格、孤島、可用區域和微服務取得整個機群的這些值，您可以使用一個排程運算來預先計算整個機群的值。這是 Timestream for LiveAnalytics 無伺服器排程查詢的強大功能，可讓這些查詢根據您的應用程式擴展需求進行擴展。

以下是在特定日期中預先計算所有伺服器最後一個點的查詢。請注意，查詢只有時間述詞，而不是維度上的述詞。時間述詞會將查詢限制在根據指定的排程表達式觸發運算後的過去一天。

```
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 執行該查詢，以計算過去一天的彙總。排程表達式 cron(0 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>

使用上述組態定義衍生的資料表，且至少有一個排程查詢的執行個體將具體化資料納入衍生的資料表後，您現在可以查詢衍生的資料表以取得最新的測量結果。以下是衍生資料表的範例查詢。

```
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 方法的這類查詢範例。由於應用程式需求是在一段時間之前尋找最新的測量，而且此開始時間可以過去，因此撰寫此查詢的方式是使用提供的時間、從指定時間使用最多一天的來源資料，然後在較舊的資料上使用衍生的資料表。如以下查詢範例所示，來源資料上的時間述詞會受限。這可確保在資料量顯著較高的來源資料表上進行有效率的處理，然後將未限制的時間述詞放在衍生的資料表上。

```
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
```

上一個只是如何建構衍生資料表的一個說明。如果您有幾年的資料，您可以使用更多層級的彙總。例如，除了每日彙總之外，您還可以每月彙總，也可以在每日彙總之前每小時彙總。因此，您可以合併最近的 以填入最後一個小時、每小時填入最後一天、每日填入最後一個月，以及每月填入較舊的 。您設定與重新整理排程的關卡數量，取決於您對這些問題的頻率，以及同時發出這些查詢的使用者數量的需求。