

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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](https://docs.aws.amazon.com/cli/latest/reference/neptune/modify-db-cluster-parameter-group.html) AWS CLI 命令或 [ModifyDBClusterParameterGroup](api-parameters.md#ModifyDBClusterParameterGroup) 管理函數，來設定這些資料庫叢集參數

**注意**  
慢查詢記錄參數是動態的，這表示變更其值不需要也不會導致重新啟動資料庫叢集。

## 在 中檢視慢查詢日誌 AWS 管理主控台
<a name="slow-query-logs-console"></a>

您可以在 中檢視和下載慢查詢日誌 AWS 管理主控台，如下所示：

在**執行個體**頁面上，選擇資料庫執行個體，然後捲動至**日誌**區段。您可以接著在那裡選擇一個日誌檔，然後選擇**下載**以下載它。

## 由 Neptune 慢查詢日誌產生的檔案
<a name="slow-query-log-files"></a>

Neptune 中由慢查詢記錄所產生的日誌檔具有下列特性：
+ 檔案會編碼為 UTF-8。
+ 查詢及其屬性是以 JSON 格式記錄。
+ 除了 `queryTime` 資料外，不會記錄 Null 和空白屬性。
+ 日誌檔會跨越多個檔案，其數目隨著執行個體大小而不同。
+ 日誌項目不會循序排列。您可以使用其 `timestamp` 值來排序它們。
+ 若要查看最新事件，您可能必須檢閱所有慢查詢日誌檔。
+ 日誌檔合計達到 100 MB 時便會輪換。無法設定此限制。

## 在 `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_tw/neptune/latest/userguide/slow-query-logs.html)

## 在 `debug` 模式中記錄的查詢屬性
<a name="slow-query-log-debug-attributes"></a>

當 `neptune_enable_slow_query_log` 資料庫叢集參數已設定為 `debug` 時，除了在 `info` 模式中記錄的屬性之外，還會記錄下列儲存體計數器屬性：


| 屬性 | Description | 
| --- | --- | 
| `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>

下列 Gemlin 查詢所需的執行時間可能會比針對慢查詢設定的閾值更長：

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