

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Cache do plano de consulta no Amazon Neptune
<a name="access-graph-qpc"></a>

 Quando uma consulta é enviada ao Neptune, a string de consulta é analisada, otimizada e transformada em um plano de consulta, executado pelo mecanismo. As aplicações muitas vezes são apoiadas por padrões de consulta comuns que são instanciados com diferentes valores. O cache do plano de consultas pode reduzir a latência geral ao armazenar em cache os planos de consulta e, assim, evitar a análise e a otimização desses padrões repetidos. 

 O Cache do Plano de Consulta pode ser usado para **OpenCypher**consultas — consultas não parametrizadas ou parametrizadas. Ele está habilitado para READ e para HTTP e Bolt. **Não** é compatível com consultas de mutação do OC. **Não** é compatível com consultas Gremlin ou SPARQL. 

## Como habilitar ou desabilitar à força o cache do plano de consultas
<a name="access-graph-qpc-enable"></a>

 O cache do plano de consulta é habilitado por padrão para consultas parametrizadas de baixa latência. Um plano para uma consulta parametrizada é armazenado em cache somente quando a latência é inferior ao limite de **100 ms**. Esse comportamento pode ser alterado para cada consulta (parametrizada ou não) por meio da dica de consulta em nível de consulta `QUERY:PLANCACHE`. Ele precisa ser usado com a cláusula `USING`. A dica de consulta aceita `enabled` ou `disabled` como valor. 

------
#### [ AWS CLI ]

Forçando o plano a ser armazenado em cache ou reutilizado:

```
aws neptunedata execute-open-cypher-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
```

Com parâmetros:

```
aws neptunedata execute-open-cypher-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
  --parameters '{"arg": 123}'
```

Forçando o plano a não ser armazenado em cache nem reutilizado:

```
aws neptunedata execute-open-cypher-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"
```

Para obter mais informações, consulte [execute-open-cypher-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-query.html)na Referência de AWS CLI Comandos.

------
#### [ SDK ]

```
import boto3
from botocore.config import Config

client = boto3.client(
    'neptunedata',
    endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
    config=Config(read_timeout=None, retries={'total_max_attempts': 1})
)

# Forcing plan to be cached or reused
response = client.execute_open_cypher_query(
    openCypherQuery='Using QUERY:PLANCACHE "enabled" MATCH(n) RETURN n LIMIT 1'
)

print(response['results'])
```

Para exemplos de AWS SDK em outras linguagens, consulte[AWS SDK](access-graph-opencypher-sdk.md).

------
#### [ awscurl ]

Forçando o plano a ser armazenado em cache ou reutilizado:

```
awscurl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  --region {{us-east-1}} \
  --service neptune-db \
  -X POST \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
```

**nota**  
Este exemplo pressupõe que suas AWS credenciais estejam configuradas em seu ambiente. {{us-east-1}}Substitua pela região do seu cluster Neptune.

------
#### [ curl ]

Forçando o plano a ser armazenado em cache ou reutilizado:

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1"
```

Com parâmetros:

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \
  -d "parameters={\"arg\": 123}"
```

Forçando o plano a não ser armazenado em cache nem reutilizado:

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"
```

------

## Como determinar se um plano está armazenado em cache ou não
<a name="access-graph-qpc-status"></a>

 Para HTTP READ, se a consulta foi enviada e o plano está armazenado em cache, `explain` mostra detalhes relevantes ao cache do plano de consultas. 

------
#### [ AWS CLI ]

```
aws neptunedata execute-open-cypher-explain-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  --explain-mode details
```

Para obter mais informações, consulte [execute-open-cypher-explain-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html) na Referência de AWS CLI Comandos.

------
#### [ SDK ]

```
import boto3
from botocore.config import Config

client = boto3.client(
    'neptunedata',
    endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
    config=Config(read_timeout=None, retries={'total_max_attempts': 1})
)

response = client.execute_open_cypher_explain_query(
    openCypherQuery='Using QUERY:PLANCACHE "enabled" MATCH(n) RETURN n LIMIT 1',
    explainMode='details'
)

print(response['results'].read().decode('utf-8'))
```

Para exemplos de AWS SDK em outras linguagens, consulte[AWS SDK](access-graph-opencypher-sdk.md).

------
#### [ awscurl ]

```
awscurl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  --region {{us-east-1}} \
  --service neptune-db \
  -X POST \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  -d "explain=details"
```

**nota**  
Este exemplo pressupõe que suas AWS credenciais estejam configuradas em seu ambiente. {{us-east-1}}Substitua pela região do seu cluster Neptune.

------
#### [ curl ]

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \
  -d "explain=details"
```

------

Se o plano foi armazenado em cache, a `explain` saída mostra:

```
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).
```

 Ao usar o Bolt, o recurso de explicação não é compatível. 

## Remoção
<a name="access-graph-qpc-eviction"></a>

 Um plano de consulta é removido pelo tempo de vida útil (TTL) do cache ou quando um número máximo de planos de consulta armazenados em cache é atingido. Quando o plano de consultas é atingido, o TTL é atualizado. Os padrões são: 
+  1000: o número máximo de planos que podem ser armazenados em cache por instância. 
+  TTL: 300 mil milissegundos ou 5 minutos. O acerto de cache reinicia o TTL e o redefine para 5 min. 

## Condições que fazem com que o plano não seja armazenado em cache
<a name="access-graph-qpc-conditions"></a>

 O cache do plano de consultas não é usado nas seguintes condições: 

1.  Quando uma consulta é enviada usando a dica de consulta `QUERY:PLANCACHE "disabled"`. Você pode executar novamente a consulta e remover `QUERY:PLANCACHE "disabled"` para habilitar o cache do plano de consulta. 

1.  Se a consulta enviada não for uma consulta parametrizada e não contiver a dica `QUERY:PLANCACHE "enabled"`. 

1.  Se o tempo de avaliação da consulta for maior que o limite de latência, a consulta não será armazenada em cache e será considerada uma consulta de longa duração que não se beneficiaria do cache do plano de consulta. 

1.  Se a consulta contiver um padrão que não retorne nenhum resultado. 
   +  Ou seja, `MATCH (n:nonexistentLabel) return n` quando há zero nós com o rótulo especificado. 
   +  Ou seja, `MATCH (n {name: $param}) return n` com `parameters={"param": "abcde"}` quando não há nenhum nó contendo `name=abcde`. 

1.  Se o parâmetro de consulta for um tipo composto, como `list` ou `map`. 

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

1.  Se o parâmetro de consulta for uma string que não fez parte de uma operação de carregamento ou inserção de dados. Por exemplo, se `CREATE (n {name: "X"})` for executado para inserir `"X"`, então `RETURN "X"` será armazenado em cache, mas `RETURN "Y"` não será armazenado em cache, pois `"Y"` não foi inserido e não existe no banco de dados. 