

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Neptune 느린 쿼리 로깅 사용
<a name="slow-query-logs"></a>

실행 속도가 느린 쿼리를 식별, 디버깅, 최적화하는 것은 어려울 수 있습니다. Neptune의 느린 쿼리 로깅을 활성화하면 장기간 실행되는 모든 쿼리의 속성이 자동으로 로깅되므로, 이 프로세스가 더 쉬워집니다.

**참고**  
느린 쿼리 로깅은 Neptune [엔진 릴리스 1.2.1.0](engine-releases-1.2.1.0.md)에 도입되었습니다.

[neptune\_enable\_slow\_query\_log](parameters.md#parameters-db-cluster-parameters-neptune_enable_slow_query_log) DB 클러스터 파라미터를 사용하여 느린 쿼리 로깅을 활성화합니다. 이 파라미터는 기본적으로 `disabled`로 설정되어 있습니다. `info` 또는 `debug`로 설정하여 느린 쿼리 로깅을 활성화합니다. `info` 설정은 실행 속도가 느린 각 쿼리의 몇 가지 유용한 속성을 로깅하는 반면, `debug` 설정은 사용 가능한 모든 속성을 로깅합니다.

느리게 실행되는 쿼리로 간주되는 쿼리의 임계값을 설정하려면 [neptune\_slow\_query\_log\_threshold](parameters.md#parameters-db-cluster-parameters-neptune_slow_query_log_threshold) DB 클러스터 파라미터를 사용하여 실행 중인 쿼리가 느린 것으로 간주되어 느린 쿼리 로깅이 활성화되었을 때 로깅되는 시간을 밀리초 단위로 지정합니다. 기본값은 5,000밀리초(5초)입니다.

이러한 DB 클러스터 파라미터는 [AWS Management Console에서](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) 관리 함수를 사용하여 설정할 수 있습니다.

**참고**  
느린 쿼리 로깅 파라미터는 동적입니다. 즉, 값을 변경해도 DB 클러스터를 다시 시작할 필요가 없으며 재시작되지도 않습니다.

## 에서 느린 쿼리 로그를 보려면 AWS Management Console
<a name="slow-query-logs-console"></a>

다음과 AWS Management Console같이에서 느린 쿼리 로그를 보고 다운로드할 수 있습니다.

**인스턴스** 페이지에서 DB 인스턴스를 선택한 다음, **로그** 섹션으로 스크롤합니다. 그런 다음 로그 파일을 선택한 후 **다운로드**를 선택하여 다운로드할 수 있습니다.

## 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` DB 클러스터 파라미터가 `info`로 설정된 경우 느린 쿼리에 대해 다음과 같은 속성이 로깅됩니다.



- ****requestResponseMetadata****
  - **속성:** `requestId` / **설명:** 쿼리의 요청 ID.
  - **속성:** `requestType` / **설명:** 요청 유형(예: HTTP 또는 WebSocket).
  - **속성:** `responseStatusCode` / **설명:** 쿼리 응답 상태 코드(예: 200).
  - **속성:** `exceptionClass` / **설명:** 쿼리 실행 후 반환된 오류의 예외 클래스.

- ****queryStats****
  - **속성:** `query` / **설명:** 쿼리 문자열.
  - **속성:** `queryFingerprint` / **설명:** 쿼리의 핑거프린트.
  - **속성:** `queryLanguage` / **설명:** 쿼리 언어(예: Gremlin, SPARQL 또는 openCypher).

- ****memoryStats****
  - **속성:** `allocatedPermits` / **설명:** 쿼리에 할당된 권한.
  - **속성:** `approximateUsedMemoryBytes` / **설명:** 실행 중 쿼리에 사용된 대략적인 메모리.

- ****queryTimeStats****
  - **속성:** `startTime` / **설명:** 쿼리 시작 시간(UTC).
  - **속성:** `overallRunTimeMs` / **설명:** 총 쿼리 실행 시간(밀리초).
  - **속성:** `parsingTimeMs` / **설명:** 쿼리 구문 분석 시간(밀리초).
  - **속성:** `waitingTimeMs` / **설명:** 쿼리 Gremlin/SPARQL/openCypher 대기열 대기 시간(밀리초).
  - **속성:** `executionTimeMs` / **설명:** 쿼리 실행 시간(밀리초).
  - **속성:** `serializationTimeMs` / **설명:** 쿼리 직렬화 시간(밀리초).

- ****statementCounters****
  - **속성:** `read` / **설명:** 읽은 문 수입니다.
  - **속성:** `written` / **설명:** 작성한 문 수.
  - **속성:** `deleted` / **설명:** 삭제된 문 수.

- ****transactionCounters****
  - **속성:** `committed` / **설명:** 커밋된 트랜잭션 수.
  - **속성:** `rolledBack` / **설명:** 롤백된 트랜잭션 수.

- ****vertexCounters****
  - **속성:** `added` / **설명:** 추가된 버텍스 수.
  - **속성:** `removed` / **설명:** 제거된 버텍스 수.
  - **속성:** `propertiesAdded` / **설명:** 추가된 버텍스 속성 수.
  - **속성:** `propertiesRemoved` / **설명:** 제거된 버텍스 속성 수.

- ****edgeCounters****
  - **속성:** `added` / **설명:** 추가된 엣지 수.
  - **속성:** `removed` / **설명:** 제거된 엣지 수.
  - **속성:** `propertiesAdded` / **설명:** 추가된 엣지 속성 수.
  - **속성:** `propertiesRemoved` / **설명:** 제거된 엣지 속성 수.

- ****resultCache****
  - **속성:** `hitCount` / **설명:** 결과 캐시 적중 횟수.
  - **속성:** `missCount` / **설명:** 결과 캐시 실패 횟수.
  - **속성:** `putCount` / **설명:** 결과 캐시 입력 횟수.

- ****concurrentExecutionStats****
  - **속성:** `acceptedQueryCountAtStart` / **설명:** 시작 시 현재 쿼리 실행과 함께 허용되는 병렬 쿼리.
  - **속성:** `runningQueryCountAtStart` / **설명:** 시작 시 현재 쿼리 실행과 함께 실행되는 병렬 쿼리.
  - **속성:** `acceptedQueryCountAtEnd` / **설명:** 종료 시 현재 쿼리 실행과 함께 허용되는 병렬 쿼리.
  - **속성:** `runningQueryCountAtEnd` / **설명:** 종료 시 현재 쿼리 실행과 함께 실행되는 병렬 쿼리.

- ****queryBatch****
  - **속성:** `queryProcessingBatchSize` / **설명:** 쿼리 처리 중 배치 크기.
  - **속성:** `querySerialisationBatchSize` / **설명:** 쿼리 직렬화 중 배치 크기.



## `debug` 모드에서 로깅된 쿼리 속성
<a name="slow-query-log-debug-attributes"></a>

`neptune_enable_slow_query_log` DB 클러스터 파라미터가 `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
  }
}
```