

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

# 使用 Amazon Neptune 慢速查询日志记录
<a name="slow-query-logs"></a>

识别、调试和优化运行缓慢的查询可能很困难。启用 Neptune 的慢速查询日志记录后，会自动记录所有长时间运行的查询的属性，以简化此过程。

**注意**  
Neptune [引擎版本 1.2.1.0](engine-releases-1.2.1.0.md) 中引入了慢速查询日志记录。

您可以使用 [neptune\$1enable\$1slow\$1query\$1log](parameters.md#parameters-db-cluster-parameters-neptune_enable_slow_query_log) 数据库集群参数启用慢速查询日志记录。默认情况下，此参数设置为 `disabled`。将其设置为 `info` 或 `debug` 可启用慢速查询日志记录。`info` 设置记录每个运行缓慢的查询的一些有用属性，而 `debug` 设置则记录所有可用属性。

要为视为运行缓慢的查询设置阈值，请使用 [neptune\$1slow\$1query\$1log\$1threshold](parameters.md#parameters-db-cluster-parameters-neptune_slow_query_log_threshold) 数据库集群参数来指定毫秒数，在此时间之后，正在运行的查询会被视为慢速查询，并在启用慢速查询日志记录时记录下来。默认值为 5000 毫秒（5 秒）。

您可以[在 AWS 管理控制台](parameter-groups.md#parameters-editgroup)、使用 [modify-db-cluster-parameter-group AWS CLI 命令或 M [od](api-parameters.md#ModifyDBClusterParameterGroup) ify DBCluster ParameterGroup 管理功能中设置这些数据库集群](https://docs.aws.amazon.com/cli/latest/reference/neptune/modify-db-cluster-parameter-group.html)参数。

**注意**  
慢速查询日志记录参数是动态的，这意味着更改其值不需要或导致数据库集群重启。

## 要在中查看慢查询日志 AWS 管理控制台
<a name="slow-query-logs-console"></a>

您可以在中查看和下载慢速查询日志 AWS 管理控制台，如下所示：

在**实例**页面上，选择该数据库实例，然后滚动到**日志**部分。然后，您可以在那里选择一个日志文件，然后选择**下载**以进行下载。

## Neptune 慢速查询日志记录生成的文件
<a name="slow-query-log-files"></a>

在 Neptune 中通过慢速查询日志记录生成的日志文件具有以下特性：
+ 这些文件以 UTF-8 编码。
+ 查询及其属性以 JSON 格式记录。
+ 除 `queryTime` 数据外，不记录 Null 属性和空属性。
+ 日志跨越多个文件，其数量根据实例大小而变化。
+ 日志条目不按先后顺序。您可以使用其 `timestamp` 值对它们进行排序。
+ 要查看最新事件，您可能必须审核所有慢速查询日志文件。
+ 日志文件在总和达到 100MiB 时轮换。此限制是无法配置的。

## 在 `info` 模式下记录的查询属性
<a name="slow-query-log-info-attributes"></a>

当 `neptune_enable_slow_query_log` 数据库集群参数设置为 `info` 时，会记录慢速查询的以下属性：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/neptune/latest/userguide/slow-query-logs.html)

## 在 `debug` 模式下记录的查询属性
<a name="slow-query-log-debug-attributes"></a>

将 `neptune_enable_slow_query_log` 数据库集群参数设置为 `debug` 后，除了在 `info` 模式下记录的属性外，还会记录以下存储计数器属性：


| 属性 | 说明 | 
| --- | --- | 
| `statementsScannedInAllIndexes` | 在所有索引中扫描的语句。 | 
| `statementsScannedSPOGIndex` | 在 SPOG 索引中扫描的语句。 | 
| `statementsScannedPOGSIndex` | 在 POGS 索引中扫描的语句。 | 
| `statementsScannedGPSOIndex` | 在 GPSO 索引中扫描的语句。 | 
| `statementsScannedOSGPIndex` | 在 OSGP 索引中扫描的语句。 | 
| `statementsScannedInChunk` | 成块一起扫描的语句。 | 
| `postFilteredStatementScans` | 扫描后筛选后留下的语句。 | 
| `distinctStatementScans` | 扫描的不同语句。 | 
| `statementsReadInAllIndexes` | 在所有索引中进行扫描后筛选后读取的语句。 | 
| `statementsReadSPOGIndex` | 在 SPOG 索引中进行扫描后筛选后读取的语句。 | 
| `statementsReadPOGSIndex` | 在 POGS 索引中进行扫描后筛选后读取的语句。 | 
| `statementsReadGPSOIndex` | 在 GPSO 索引中进行扫描后筛选后读取的语句。 | 
| `statementsReadOSGPIndex` | 在 OSGP 索引中进行扫描后筛选后读取的语句。 | 
| `accessPathSearches` | 访问路径搜索次数。 | 
| `fullyBoundedAccessPathSearches` | 完全限定的密钥访问路径搜索次数。 | 
| `accessPathSearchedByPrefix` | 按前缀搜索的访问路径数。 | 
| `searchesWhereRecordsWereFound` | 输出 1 条或更多记录的搜索次数。 | 
| `searchesWhereRecordsWereNotFound` | 输出中没有记录的搜索次数。 | 
| `totalRecordsFoundInSearches` | 从所有搜索中找到的记录总数。 | 
| `statementsInsertedInAllIndexes` | 所有索引中插入的语句数。 | 
| `statementsUpdatedInAllIndexes` | 所有索引中更新的语句数。 | 
| `statementsDeletedInAllIndexes` | 所有索引中删除的语句数。 | 
| `predicateCount` | 谓词的数量。 | 
| `dictionaryReadsFromValueToIdTable` | 从值到 ID 表的字典读取次数。 | 
| `dictionaryReadsFromIdToValueTable` | 从值的 ID 表中读取字典的次数。 | 
| `dictionaryWritesToValueToIdTable` | 向值到 ID 表进行字典写入的次数。 | 
| `dictionaryWritesToIdToValueTable` | 向 ID 到值表进行字典写入的次数。 | 
| `rangeCountsInAllIndexes` | 所有索引中的范围计数数量。 | 
| `deadlockCount` | 查询中的死锁数。 | 
| `singleCardinalityInserts` | 执行的单基数插入次数。 | 
| `singleCardinalityInsertDeletions` | 在单基数插入期间删除的语句数。 | 
| `sharedLocksWaitTimeMillis` | 等待共享锁所花费的毫秒数。 | 
| `exclusiveLocksWaitTimeMillis` | 等待独占锁所花费的毫秒数。 | 

## 慢速查询的调试日志记录示例
<a name="slow-query-log-debug-output-sample"></a>

以下 Gremlin 查询的运行时间可能比为慢速查询设置的阈值更长：

```
gremlin=g.V().has('code','AUS').repeat(out().simplePath()).until(has('code','AGR')).path().by('code').limit(20).fold()
```

然后，如果在调试模式下启用了慢速查询日志记录，则将以这样的形式记录查询的以下属性：

```
{
  "requestResponseMetadata": {
    "requestId": "5311e493-0e98-457e-9131-d250a2ce1e12",
    "requestType": "HTTP_GET",
    "responseStatusCode": 200
  },
  "queryStats": {
    "query": "gremlin=g.V().has('code','AUS').repeat(out().simplePath()).until(has('code','AGR')).path().by('code').limit(20).fold()",
    "queryFingerprint": "g.V().has(string0,string1).repeat(__.out().simplePath()).until(__.has(string0,string2)).path().by(string0).limit(long0).fold()",
    "queryLanguage": "Gremlin"
  },
  "memoryStats": {
    "allocatedPermits": 20,
    "approximateUsedMemoryBytes": 14838
  },
  "queryTimeStats": {
    "startTime": "23/02/2023 11:42:52.657",
    "overallRunTimeMs": 2249,
    "executionTimeMs": 2229,
    "serializationTimeMs": 13
  },
  "statementCounters": {
    "read": 69979
  },
  "transactionCounters": {
    "committed": 1
  },
  "concurrentExecutionStats": {
    "acceptedQueryCountAtStart": 1
  },
  "queryBatchStats": {
    "queryProcessingBatchSize": 1000,
    "querySerialisationBatchSize": 1000
  },
  "storageCounters": {
    "statementsScannedInAllIndexes": 69979,
    "statementsScannedSPOGIndex": 44936,
    "statementsScannedPOGSIndex": 4,
    "statementsScannedGPSOIndex": 25039,
    "statementsReadInAllIndexes": 68566,
    "statementsReadSPOGIndex": 43544,
    "statementsReadPOGSIndex": 2,
    "statementsReadGPSOIndex": 25020,
    "accessPathSearches": 27,
    "fullyBoundedAccessPathSearches": 27,
    "dictionaryReadsFromValueToIdTable": 10,
    "dictionaryReadsFromIdToValueTable": 17,
    "rangeCountsInAllIndexes": 4,
    "sharedLocksWaitTimeMillis": 0,
    "exclusiveLocksWaitTimeMillis": 0
  }
}
```