

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Cache du plan de requête dans Amazon Neptune
<a name="access-graph-qpc"></a>

 Lorsqu'une requête est soumise à Neptune, la chaîne de requête est analysée, optimisée et transformée en un plan de requête, qui est ensuite exécuté par le moteur. Les applications sont souvent soutenues par des modèles de requête courants instanciés avec des valeurs différentes. Le cache des plans de requêtes peut réduire la latence globale en mettant en cache les plans de requêtes et en évitant ainsi l'analyse et l'optimisation pour de tels modèles répétés. 

 Le cache du plan de requête peut être utilisé pour les **OpenCypher**requêtes, qu'elles soient paramétrées ou non paramétrées. Il est activé pour READ, HTTP et Bolt. Il **n'est pas** pris en charge pour les requêtes de mutation OC. Il **n'est pas** pris en charge pour les requêtes G705 ou SPARQL. 

## Comment forcer l'activation ou la désactivation du cache du plan de requêtes
<a name="access-graph-qpc-enable"></a>

 Le cache du plan de requêtes est activé par défaut pour les requêtes paramétrées à faible latence. **Un plan pour une requête paramétrée est mis en cache uniquement lorsque le temps de latence est inférieur au seuil de 100 ms.** Ce comportement peut être remplacé par requête (paramétré ou non) par le Query Hint au niveau de la requête. `QUERY:PLANCACHE` Il doit être utilisé avec la `USING` clause. L'indice de requête accepte `enabled` ou `disabled` en tant que valeur. 

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

Forcer le plan à être mis en cache ou réutilisé :

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

Avec paramètres :

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

Forcer le plan à ne pas être mis en cache ni réutilisé :

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

Pour plus d'informations, consultez [execute-open-cypher-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-query.html)le manuel de référence des AWS CLI commandes.

------
#### [ 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'])
```

Pour des exemples de AWS SDK dans d'autres langues, voir[AWS SDK](access-graph-opencypher-sdk.md).

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

Forcer le plan à être mis en cache ou réutilisé :

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

**Note**  
Cet exemple suppose que vos AWS informations d'identification sont configurées dans votre environnement. Remplacez *us-east-1* par la région de votre cluster Neptune.

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

Forcer le plan à être mis en cache ou réutilisé :

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

Avec paramètres :

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

Forcer le plan à ne pas être mis en cache ni réutilisé :

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

------

## Comment déterminer si un plan est mis en cache ou non
<a name="access-graph-qpc-status"></a>

 Pour HTTP READ, si la requête a été soumise et que le plan a été mis en cache, `explain` les détails relatifs au cache du plan de requête seront affichés. 

------
#### [ 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
```

Pour plus d'informations, consultez [execute-open-cypher-explain-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html) dans le manuel de référence des AWS CLI commandes.

------
#### [ 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'))
```

Pour des exemples de AWS SDK dans d'autres langues, voir[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"
```

**Note**  
Cet exemple suppose que vos AWS informations d'identification sont configurées dans votre environnement. Remplacez *us-east-1* par la région de votre 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"
```

------

Si le plan a été mis en cache, le `explain` résultat indique :

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

 Lorsque vous utilisez Bolt, la fonction d'explication n'est pas prise en charge. 

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

 Un plan de requête est supprimé en fonction de la durée de vie du cache (TTL) ou lorsqu'un nombre maximum de plans de requêtes mis en cache est atteint. Lorsque le plan de requête est atteint, le TTL est actualisé. Les valeurs par défaut sont les suivantes : 
+  1000 : nombre maximum de plans pouvant être mis en cache par instance. 
+  TTL - 300 000 millisecondes ou 5 minutes. L'accès au cache redémarre le TTL et le réinitialise à 5 minutes. 

## Conditions empêchant le plan d'être mis en cache
<a name="access-graph-qpc-conditions"></a>

 Le cache du plan de requête ne serait pas utilisé dans les conditions suivantes : 

1.  Lorsqu'une requête est soumise à l'aide de l'indice de requête`QUERY:PLANCACHE "disabled"`. Vous pouvez réexécuter la requête et la supprimer `QUERY:PLANCACHE "disabled"` pour activer le cache du plan de requête. 

1.  Si la requête soumise n'est pas une requête paramétrée et ne contient pas l'indice. `QUERY:PLANCACHE "enabled"` 

1.  Si le temps d'évaluation de la requête est supérieur au seuil de latence, la requête n'est pas mise en cache et est considérée comme une requête de longue durée qui ne bénéficierait pas du cache du plan de requêtes. 

1.  Si la requête contient un modèle qui ne renvoie aucun résultat. 
   +  c'est-à-dire `MATCH (n:nonexistentLabel) return n` lorsqu'il n'y a aucun nœud avec l'étiquette spécifiée. 
   +  c'est-à-dire `MATCH (n {name: $param}) return n` `parameters={"param": "abcde"}` lorsqu'il n'y a aucun nœud contenant`name=abcde`. 

1.  Si le paramètre de requête est un type composite, tel que a `list` ou `map` a. 

   ```
   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.  Si le paramètre de requête est une chaîne qui n'a pas fait partie d'une opération de chargement ou d'insertion de données. Par exemple, s'il `CREATE (n {name: "X"})` est exécuté pour insérer`"X"`, `RETURN "X"` il est mis en cache, alors qu'`RETURN "Y"`il ne le serait pas, car il n'`"Y"`a pas été inséré et n'existe pas dans la base de données. 