

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

# Amazon Neptune의 쿼리 계획 캐시
<a name="access-graph-qpc"></a>

 쿼리가 Neptune에 제출되면 쿼리 문자열이 구문 분석, 최적화 및 쿼리 계획으로 변환된 다음 엔진에서 실행됩니다. 애플리케이션은 종종 서로 다른 값으로 인스턴스화되는 일반적인 쿼리 패턴에 의해 지원됩니다. 쿼리 계획 캐시는 쿼리 계획을 캐싱하여 반복되는 패턴에 대한 구문 분석 및 최적화를 방지함으로써 전체 지연 시간을 줄일 수 있습니다.

 쿼리 계획 캐시는 파라미터화되지 않았거나 파라미터화된 쿼리인 **OpenCypher** 쿼리에 사용할 수 있습니다. READ와 HTTP 및 Bolt에 대해 활성화됩니다. OC 변형 쿼리에는 지원되지 **않습니다**. Gremlin 또는 SPARQL 쿼리에는 지원되지 **않습니다**.

## 쿼리 계획 캐시를 강제로 활성화 또는 비활성화하는 방법
<a name="access-graph-qpc-enable"></a>

 쿼리 계획 캐시는 지연 시간이 짧은 파라미터화된 쿼리에 대해 기본적으로 활성화됩니다. 파라미터화된 쿼리에 대한 계획은 지연 시간이 **100ms**의 임계값보다 낮은 경우에만 캐시됩니다. 이 동작은 쿼리 수준 쿼리 힌트 `QUERY:PLANCACHE`를 통해 쿼리별(파라미터화 여부와 무관하게)로 재정의할 수 있습니다. `USING` 절과 함께 사용해야 합니다. 쿼리 힌트는 `enabled` 또는 `disabled`를 값으로 허용합니다.

```
# Forcing plan to be cached or reused
% curl -k https://<endpoint>:<port>/opencypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
  
% curl -k https://<endpoint>:<port>/opencypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
  -d "parameters={\"arg\": 123}"
  
# Forcing plan to be neither cached nor reused
% curl -k https://<endpoint>:<port>/opencypher \
  -d "query=Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"
```

## 계획이 캐시되었는지 여부를 확인하는 방법
<a name="access-graph-qpc-status"></a>

 HTTP READ의 경우, 쿼리가 제출되고 계획이 캐시된 경우 `explain`은 쿼리 계획 캐시와 관련된 세부 정보를 표시합니다.

```
% curl -k https://<endpoint>:<port>/opencypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  -d "explain=[static|details]"

Query: <QUERY STRING>
Plan cached by request: <REQUEST ID OF FIRST TIME EXECUTION>
Plan cached at: <TIMESTAMP OF FIRST TIME EXECUTION>
Parameters: <PARAMETERS, IF QUERY IS PARAMETERIZED QUERY>
Plan cache hits: <NUMBER OF CACHE HITS FOR CACHED PLAN>
First query evaluation time: <LATENCY OF FIRST TIME EXECUTION>

The query has been executed based on a cached query plan. Detailed explain with operator runtime statistics can be obtained by running the query with plan cache disabled (using HTTP parameter planCache=disabled).
```

 Bolt를 사용하는 경우 설명 기능은 지원되지 않습니다.

## 제거
<a name="access-graph-qpc-eviction"></a>

 쿼리 계획은 캐시 TTL(Time to Live) 또는 캐시된 쿼리 계획의 최대 수에 도달했을 때 제거됩니다. 쿼리 계획에 도달하면 TTL이 새로 고쳐집니다. 기본값은 다음과 같습니다.
+  1000 - 인스턴스당 캐시할 수 있는 최대 계획 수입니다.
+  TTL - 300,000밀리초 또는 5분. 캐시 적중은 TTL을 다시 시작하고 다시 5분으로 재설정합니다.

## 계획이 캐시되지 않는 조건
<a name="access-graph-qpc-conditions"></a>

 다음 조건에서는 쿼리 계획 캐시가 사용되지 않습니다.

1.  쿼리 힌트 `QUERY:PLANCACHE "disabled"`를 사용하여 쿼리를 제출하는 경우입니다. 쿼리를 다시 실행하고 `QUERY:PLANCACHE "disabled"`를 제거하여 쿼리 계획 캐시를 활성화할 수 있습니다.

1.  제출된 쿼리가 파라미터화된 쿼리가 아니며 힌트 `QUERY:PLANCACHE "enabled"`를 포함하지 않는 경우입니다.

1.  쿼리 평가 시간이 지연 시간 임계값보다 클 경우, 해당 쿼리는 캐시되지 않으며 쿼리 계획 캐시의 혜택을 받지 못하는 장기 실행 쿼리로 간주됩니다.

1.  쿼리에 결과를 반환하지 않는 패턴이 포함된 경우입니다.
   +  즉, 지정된 레이블을 가진 노드가 없는 경우에 `MATCH (n:nonexistentLabel) return n` 
   +  즉, `name=abcde`를 포함하는 노드가 없는 경우에 `parameters={"param": "abcde"}`인 `MATCH (n {name: $param}) return n` 

1.  쿼리 파라미터가 `list` 또는 `map`과 같은 복합 유형인 경우입니다.

   ```
   curl -k https://<endpoint>:<port>/opencypher \
     -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
     -d "parameters={\"arg\": [1, 2, 3]}"
   
   curl -k https://<endpoint>:<port>/opencypher \
     -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
     -d "parameters={\"arg\": {\"a\": 1}}"
   ```

1.  쿼리 파라미터가 데이터 로드 또는 데이터 삽입 작업의 일부가 아니었던 문자열인 경우입니다. 예를 들어, `"X"`를 삽입하기 위해 `CREATE (n {name: "X"})`가 실행되면 `RETURN "Y"`는 캐시되지만, `RETURN "X"`는 캐시되지 않으며 `"Y"`는 삽입되지 않았으며 데이터베이스에 존재하지 않습니다.