优化 Amazon Timestream 中的数据访问 - Amazon Timestream
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

优化 Amazon Timestream 中的数据访问

您可以使用时间流分区方案或数据组织技术优化 Amazon Timestream 中的数据访问模式。

时间流分区方案

Amazon Timestream 使用高度可扩展的分区方案,其中每个 Timestream 表可以有数百、数千甚至数百万个独立分区。高度可用的分区跟踪和索引服务可以管理分区,从而最大限度地减少故障的影响,并提高系统的弹性。

时间流分区方案

数据组织

Timestream 将其摄取的每个数据点存储在单个分区中。当您将数据提取到 Timestream 表时,Timestream 会根据数据中的时间戳、分区键和其他上下文属性自动创建分区。除了按时对数据进行分区(时间分区)外,Timestream 还根据选定的分区键和其他维度(空间分区)对数据进行分区。这种方法旨在分发写入流量,并允许对查询的数据进行有效修剪。

查询见解功能为查询的删减效率提供了宝贵的见解,包括查询空间覆盖范围和查询时间覆盖范围。

QuerySpatialCoverage

QuerySpatialCoverage指标提供了对已执行查询的空间覆盖范围的见解,以及空间修剪效率最低的表。这些信息可以帮助您确定分区策略中需要改进的领域,以增强空间修剪。QuerySpatialCoverage指标的值介于 0 和 1 之间。指标值越低,查询在空间轴上的修剪效果越好。例如,值为 0.1 表示查询扫描空间轴的 10%。值为 1 表示查询扫描了 100% 的空间轴。

例 使用查询见解来分析查询的空间覆盖范围

假设你有一个存储天气数据的 Timestream 数据库。假设位于美国不同州的气象站每小时记录一次温度。想象一下,您选择State作为客户定义的分区密钥 (CDPK) 来按状态对数据进行分区。

假设您执行查询以检索特定日期下午 2 点至下午 4 点之间加利福尼亚所有气象站的平均温度。以下示例显示了针对此场景的查询。

SELECT AVG(temperature) FROM "weather_data"."hourly_weather" WHERE time >= '2024-10-01 14:00:00' AND time < '2024-10-01 16:00:00' AND state = 'CA';

使用查询见解功能,您可以分析查询的空间覆盖范围。假设该QuerySpatialCoverage指标返回的值为 0.02。这意味着查询仅扫描了空间轴的 2%,这很高效。在本例中,该查询能够有效地修剪空间范围,只从加利福尼亚州检索数据,而忽略来自其他州的数据。

相反,如果QuerySpatialCoverage指标返回的值为 0.8,则表示查询扫描了 80% 的空间轴,效率较低。这可能表明,需要完善分区策略以改善空间修剪。例如,您可以将分区键选择为城市或区域,而不是州。通过分析QuerySpatialCoverage指标,您可以发现优化分区策略和提高查询性能的机会。

下图显示了空间修剪效果不佳。

该QuerySpatialCoverage指标提供的结果显示空间修剪效果不佳。

要提高空间修剪效率,可以执行以下一项或两项操作:

  • measure_name查询中添加、默认分区密钥或使用 CDPK 谓词。

  • 如果您已经添加了前面提到的属性,请删除围绕这些属性或子句的函数,例如LIKE

QueryTemporalCoverage

QueryTemporalCoverage指标提供对已执行查询所扫描的时间范围的见解,包括扫描时间范围最大的表。该QueryTemporalCoverage指标的值是以纳秒表示的时间范围。该指标的值越低,查询在时间范围上的修剪越优化。例如,扫描最后几分钟数据的查询比扫描表的整个时间范围的查询性能更高。

假设你有一个 Timestream 数据库,用于存储物联网传感器数据,每分钟从位于制造工厂的设备上进行一次测量。假设您已将数据分区为。device_ID

假设您执行查询以检索过去 30 分钟内特定设备的平均传感器读数。以下示例显示了针对此场景的查询。

SELECT AVG(sensor_reading) FROM "sensor_data"."factory_1" WHERE device_id = 'DEV_123' AND time >= NOW() - INTERVAL 30 MINUTE and time < NOW();

使用查询见解功能,您可以分析查询所扫描的时间范围。想象一下,该QueryTemporalCoverage指标返回的值为 1800000000000 纳秒(30 分钟)。这意味着该查询仅扫描最近 30 分钟的数据,这是一个相对狭窄的时间范围。这是一个好兆头,因为它表明查询能够有效地修剪时间分区,并且只检索了请求的数据。

相反,如果该QueryTemporalCoverage指标返回的值为 1 年(以纳秒为单位),则表示查询扫描了表中一年的时间范围,这会降低效率。这可能表明该查询未针对时间修剪进行优化,您可以通过添加时间过滤器来对其进行改进。

下图显示临时修剪效果不佳。

QueryTemporalCoverage指标提供的结果显示临时修剪效果不佳。

为了改善时间修剪,我们建议您执行以下一项或全部操作:

  • 在查询中添加缺少的时间谓词,并确保时间谓词正在修剪所需的时间窗口。

  • 移除函数MAX(),例如在时间谓词前后。

  • 向所有子查询添加时间谓词。如果您的子查询要联接大型表或执行复杂的操作,则这一点很重要。