

# 确定 DynamoDB 中未使用的资源
<a name="CostOptimization_UnusedResources"></a>

本部分概述如何定期评估未使用资源。随着应用程序需求的演变，您应确保没有未使用的资源，并且不会导致不必要的 Amazon DynamoDB 成本。下面介绍的过程将使用 Amazon CloudWatch 指标来确定未使用的资源，帮助您识别这些资源并对其采取措施以降低成本。

您可以使用 CloudWatch 监控 DynamoDB，此工具可以从 DynamoDB 收集原始数据，处理为可读取的近实时指标。这些统计数据会保留一段时间，这样您便可以访问历史信息，更好地了解使用情况。默认情况下，DynamoDB 指标数据自动发送到 CloudWatch。有关更多信息，请参阅《Amazon CloudWatch 用户指南》**中的[什么是 Amazon CloudWatch？](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)和[指标保留](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#metrics-retention)。

**Topics**
+ [如何确定未使用的资源](#CostOptimization_UnusedResources_Identifying)
+ [确定未使用的表资源](#CostOptimization_UnusedResources_Tables)
+ [清理未使用的表资源](#CostOptimization_UnusedResources_Tables_Cleanup)
+ [确定未使用的 GSI 资源](#CostOptimization_UnusedResources_GSI)
+ [清理未使用的 GSI 资源](#CostOptimization_UnusedResources_GSI_Cleanup)
+ [清理未使用的全局表](#CostOptimization_UnusedResources_GlobalTables)
+ [清理未使用的备份或时间点故障恢复（PITR）](#CostOptimization_UnusedResources_Backups)

## 如何确定未使用的资源
<a name="CostOptimization_UnusedResources_Identifying"></a>

为了确定未使用的表或索引，我们将查看以下 30 天内的 CloudWatch 指标，以了解是否对表进行了任何有效的读取或写入，或者全局二级索引 (GSI, Global Secondary Index) 上是否有任何读取操作：

**[已使用读取容量单位](metrics-dimensions.md#ConsumedReadCapacityUnits)**  
在指定时间段内使用的读取容量单位数，这样便可以跟踪您在已占用容量中使用的容量。可以检索表及其所有全局二级索引或特定全局二级索引占用的总读取容量。

**[已使用写入容量单位](metrics-dimensions.md#ConsumedWriteCapacityUnits)**  
在指定时间段内使用的写入容量单位数，这样便可以跟踪您在已占用容量中使用的容量。可以检索表及其所有全局二级索引或特定全局二级索引占用的总写入容量。

## 确定未使用的表资源
<a name="CostOptimization_UnusedResources_Tables"></a>

Amazon CloudWatch 是一项监控和可观察性服务，提供可用于确定未使用资源的 DynamoDB 表指标。CloudWatch 指标可以通过 Amazon Web Services 管理控制台 以及 Amazon Command Line Interface 查看。

------
#### [ Amazon Command Line Interface ]

要通过 Amazon Command Line Interface 查看表中的指标，可以使用以下命令。

1. 首先，评估您的表的读取数：

   ```
   aws cloudwatch get-metric-statistics --metric-name
   ConsumedReadCapacityUnits --start-time <start-time> --end-time <end-
   time> --period <period> --namespace AWS/DynamoDB --statistics Sum --
   dimensions Name=TableName,Value=<table-name>
   ```

   为了避免错误地将表标识为未使用，请评估较长时段内的指标。选择合适的开始时间和结束时间范围（例如 **30 天**）以及合适的时间段（例如 **86400**）。

   在返回的数据中，任何大于 **0** 的 **Sum**（合计）都表示您所评估的表在该时间段内收到了读取流量。

   以下结果显示表在评估时段内收到了读取流量：

   ```
           {
               "Timestamp": "2022-08-25T19:40:00Z",
               "Sum": 36023355.0,
               "Unit": "Count"
           },
           {
               "Timestamp": "2022-08-12T19:40:00Z",
               "Sum": 38025777.5,
               "Unit": "Count"
           },
   ```

   以下结果显示表在评估时段内未收到读取流量：

   ```
           {
               "Timestamp": "2022-08-01T19:50:00Z",
               "Sum": 0.0,
               "Unit": "Count"
           },
           {
               "Timestamp": "2022-08-20T19:50:00Z",
               "Sum": 0.0,
               "Unit": "Count"
           },
   ```

1. 接下来，评估表的写入数量：

   ```
   aws cloudwatch get-metric-statistics --metric-name
   ConsumedWriteCapacityUnits --start-time <start-time> --end-time <end-
   time> --period <period> --namespace AWS/DynamoDB --statistics Sum --
   dimensions Name=TableName,Value=<table-name>
   ```

   为了避免错误地将表标识为未使用，您需要评估较长时段内的指标。选择合适的开始时间和结束时间范围（例如 **30 天**）以及合适的时间段，例如 **86400**。

   在返回的数据中，任何大于 **0** 的 **Sum**（合计）都表示您所评估的表在该时间段内收到了读取流量。

   以下结果显示表在评估时段内收到了写入流量：

   ```
           {
               "Timestamp": "2022-08-19T20:15:00Z",
               "Sum": 41014457.0,
               "Unit": "Count"
           },
           {
               "Timestamp": "2022-08-18T20:15:00Z",
               "Sum": 40048531.0,
               "Unit": "Count"
           },
   ```

   以下结果显示表在评估时段内未收到写入流量：

   ```
           {
               "Timestamp": "2022-07-31T20:15:00Z",
               "Sum": 0.0,
               "Unit": "Count"
           },
           {
               "Timestamp": "2022-08-19T20:15:00Z",
               "Sum": 0.0,
               "Unit": "Count"
           },
   ```

------
#### [ Amazon Web Services 管理控制台 ]

利用以下步骤，您可以通过 Amazon Web Services 管理控制台 评估资源利用率。

1. 登录 Amazon 控制台并导航到 CloudWatch 服务页面，网址为 [https://console.aws.amazon.com/cloudwatch/](https://console.amazonaws.cn/cloudwatch/)。如有必要，请在控制台右上角选择相应的 Amazon 区域。

1. 在左侧导航栏中，找到“指标”部分，然后选择**全部指标**。

1. 以上操作将打开一个控制面板，其中包含两个面板。在顶部面板中，您将看到以图表表示的当前指标。在底部，您可选择用于绘制图表的指标。在底部面板中选择 DynamoDB。

1. 在 DynamoDB 指标选择面板中，选择**表指标**类别以显示当前区域中表的指标。

1. 向下滚动菜单来标识您的表名，然后选择表的指标 `ConsumedReadCapacityUnits` 和 `ConsumedWriteCapacityUnits`。

1. 选择**绘成图表的指标(2)** 选项卡，然后将**统计信息**列调整为**总计**。  
![\[绘成图表的指标选项卡。统计信息设置为总计，以便在控制台中查看资源使用情况数据。\]](http://docs.amazonaws.cn/amazondynamodb/latest/developerguide/images/CostOptimization/GraphedMetricsTab.png)

1. 为了避免错误地将表标识为未使用，您需要评估较长时段内的指标。在图形面板顶部选择相应的时间范围来评估表，例如 1 个月。选择**自定义**，然后在下拉菜单中选择 **1 个月**并选择**应用**。  
![\[CloudWatch 控制台。选择了 1 个月的自定义时间范围来评估指标。\]](http://docs.amazonaws.cn/amazondynamodb/latest/developerguide/images/CostOptimization/OneMonthTimeFrame.png)

1. 评估您的表的绘成图表的指标，以确定是否使用了该表。大于 **0** 的指标表示在评估时间段内使用了表。读取和写入均为 **0** 的空白图指示未使用表。

   下图显示了具有读取流量的表：  
![\[该图显示了 DynamoDB 表的 ConsumedReadCapacityUnits，表明该表正在使用中。\]](http://docs.amazonaws.cn/amazondynamodb/latest/developerguide/images/CostOptimization/TableWithReadTraffic.png)

   下图显示了没有读取流量的表：  
![\[该图显示 DynamoDB 表没有读取活动，表明该表未在使用中。\]](http://docs.amazonaws.cn/amazondynamodb/latest/developerguide/images/CostOptimization/TableWithoutReadTraffic.png)

------

## 清理未使用的表资源
<a name="CostOptimization_UnusedResources_Tables_Cleanup"></a>

如果您已确定未使用的表资源，则可以通过以下方式降低其持续成本。

**注意**  
如果您已确定未使用的表，但仍希望将其保持可用状态，以防将来需要访问该表，请考虑将其切换到按需模式。否则，您可以考虑备份并彻底删除该表。

**容量模式**  
DynamoDB 对 DynamoDB 表收取读取、写入和存储数据费用。

DynamoDB 具有按需和预置这[两种容量模式](capacity-mode.md)，它们对表上处理的读取和写入采用特定的计费选项。读/写容量模式控制对读写吞吐量收费的方式以及管理容量的方式。

对于按需模式表，您无需指定预期应用程序执行的读写吞吐量。DynamoDB 按照读取请求单位和写入请求单位对应用程序在表上执行的读取和写入操作收费。如果表/索引上没有活动，则您无需为吞吐量付费，但仍会产生存储费用。

**表类**  
DynamoDB 还提供了[两个表类](HowItWorks.TableClasses.md)，旨在帮助您优化成本。“DynamoDB 标准”表类是原定设置，建议用于大多数工作负载。“DynamoDB 标准-不经常访问 (DynamoDB Standard-IA)”表类别针对存储占据主要成本的表进行优化。

如果您的表或索引上没有活动，则主要成本可能是存储成本，更改表类将节省大量费用。

**删除表**  
如果您发现了一个未使用的表并想将其删除，则可能需要先备份或导出数据。

通过 Amazon Backup 执行的备份可以利用冷存储分层，从而进一步降低成本。有关如何启用通过 [将 Amazon Backup 与 DynamoDB 结合使用](backuprestore_HowItWorksAWS.md) Backup 进行备份的信息，请参阅 Amazon 文档；有关如何使用生命周期将备份转移到冷存储的信息，请参阅[管理备份计划](https://docs.amazonaws.cn/aws-backup/latest/devguide/about-backup-plans)文档。

或者，您可以选择将表的数据导出到 S3。为此，请参阅[导出至 Amazon S3](S3DataExport.HowItWorks.md) 文档。导出数据后，如果您希望利用 S3 Glacier Instant Retrieval、S3 Glacier Flexile Retrieval 或 S3 Glacier Deep Archive 进一步降低成本，请参阅[管理存储生命周期](https://docs.amazonaws.cn/AmazonS3/latest/userguide/object-lifecycle-mgmt)。

备份表后，您可以选择通过 Amazon Web Services 管理控制台 或通过 Amazon Command Line Interface 将其删除。

## 确定未使用的 GSI 资源
<a name="CostOptimization_UnusedResources_GSI"></a>

确定未使用的全局二级索引的步骤与确定未使用的表的步骤类似。在写入基表的项目中包含用作 GSI 分区键的属性时，由于 DynamoDB 会将此类项目复制到 GSI，如果基表在使用，则未使用的 GSI 仍有可能具有大于 0 的 `ConsumedWriteCapacityUnits`。因此，您将仅评估 `ConsumedReadCapacityUnits` 指标来确定 GSI 是否未使用。

要通过 Amazon Amazon CLI 查看 GSI 指标，您可以使用以下命令评估表的读取数：

```
aws cloudwatch get-metric-statistics --metric-name
ConsumedReadCapacityUnits --start-time <start-time> --end-time <end-
time> --period <period> --namespace AWS/DynamoDB --statistics Sum --
dimensions Name=TableName,Value=<table-name>
Name=GlobalSecondaryIndexName,Value=<index-name>
```

为了避免错误地将表标识为未使用，您需要评估较长时段内的指标。选择合适的开始时间和结束时间范围（例如 30 天）以及合适的时间段，例如 86400。

在返回的数据中，任何大于 0 的 Sum（合计）都表示您所评估的表在该时间段内收到了读取流量。

以下结果显示 GSI 在评估时段内收到了读取流量：

```
        {
          "Timestamp": "2022-08-17T21:20:00Z",
          "Sum": 36319167.0,
          "Unit": "Count"
        },
        {
          "Timestamp": "2022-08-11T21:20:00Z",
          "Sum": 1869136.0,
          "Unit": "Count"
        },
```

以下结果显示 GSI 在评估时段内收到了极少的读取流量：

```
        {
          "Timestamp": "2022-08-28T21:20:00Z",
          "Sum": 0.0,
          "Unit": "Count"
        },
        {
          "Timestamp": "2022-08-15T21:20:00Z",
          "Sum": 2.0,
          "Unit": "Count"
        },
```

以下结果显示 GSI 在评估时段内未收到读取流量：

```
        {
          "Timestamp": "2022-08-17T21:20:00Z",
          "Sum": 0.0,
          "Unit": "Count"
        },
        {
          "Timestamp": "2022-08-11T21:20:00Z",
          "Sum": 0.0,
          "Unit": "Count"
        },
```

## 清理未使用的 GSI 资源
<a name="CostOptimization_UnusedResources_GSI_Cleanup"></a>

如果您已确定未使用的 GSI，则可以选择将其删除。由于 GSI 中存在的所有数据也存在于基表中，因此在删除 GSI 之前无需进行额外备份。如果以后会再次需要 GSI，则可以将其重新添加到表中。

如果您发现了不常使用的 GSI，则应考虑更改应用程序中的设计，以便将其删除或减少其成本。例如，虽然 DynamoDB 扫描会消耗大量系统资源而应谨慎使用，但如果很少使用其支持的访问模式，则它们可能比 GSI 更具成本效益。

此外，如果需要 GSI 来支持不频繁的访问模式，可以考虑规划一组更有限的属性。尽管后续可能需要对基表进行查询以支持不频繁的访问模式，但它有可能显著降低存储和写入成本。

## 清理未使用的全局表
<a name="CostOptimization_UnusedResources_GlobalTables"></a>

Amazon DynamoDB 全局表 为部署多区域、多活跃数据库提供了完全托管式解决方案，而不必构建和维护您自己的复制解决方案。

全局表非常适合在靠近用户的位置提供对数据的低延迟访问，也可以用作灾难恢复的辅助区域。

如果为某个资源启用了全局表选项以提供低延迟的数据访问，但该选项并未包括在灾难恢复策略中，请通过评估副本的 CloudWatch 指标来验证这两个副本是否正在主动处理读取流量。如果一个副本没有处理读取流量，则它可能是未使用的资源。

如果全局表包括在灾难恢复策略中，则在主动/备用模式下，预计会有一个副本不会收到读取流量。

## 清理未使用的备份或时间点故障恢复（PITR）
<a name="CostOptimization_UnusedResources_Backups"></a>

DynamoDB 提供两种备份方式。时间点故障恢复提供最多 35 天的连续备份，这样您就防止意外的写入或删除，同时利用按需备份就能够创建可长期保存的快照。您可以将恢复期设置为 1 天到 35 天之间的任何值。这两种类型的备份都有相关的成本。

请参阅 [DynamoDB 的备份和还原](Backup-and-Restore.md) 和 [DynamoDB 的时间点备份](Point-in-time-recovery.md) 文档，以确定您的表是否启用了可能不再需要的备份。