

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Cache del piano di query in Amazon Neptune
<a name="access-graph-qpc"></a>

 Quando una query viene inviata a Neptune, la stringa di query viene analizzata, ottimizzata e trasformata in un piano di query, che viene quindi eseguito dal motore. Le applicazioni sono spesso supportate da modelli di query comuni che vengono istanziati con valori diversi. La cache dei piani di query può ridurre la latenza complessiva memorizzando nella cache i piani di query ed evitando così l'analisi e l'ottimizzazione per tali modelli ripetuti. 

 Query Plan Cache può essere utilizzato per le ** OpenCypher ** query, sia non parametrizzate che parametrizzate. È abilitato per READ e per HTTP e Bolt. **Non è ** supportato per le interrogazioni sulla mutazione OC. **Non è ** supportato per le interrogazioni su Gremlin o SPARQL. 

## Come forzare l'attivazione o la disattivazione della cache del piano di interrogazione
<a name="access-graph-qpc-enable"></a>

 La cache del piano di query è abilitata di default per le query parametrizzate a bassa latenza. Un piano per una query con parametri viene memorizzato nella cache solo quando la latenza è inferiore alla soglia di 100 ms. ** ** Questo comportamento può essere sovrascritto per singola query (parametrizzata o meno) dal Query Hint a livello di query. `QUERY:PLANCACHE` Deve essere utilizzato con la clausola. `USING` Il suggerimento per la query accetta `enabled` o `disabled` come valore. 

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

Forzare la memorizzazione nella cache o il riutilizzo del piano:

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

Con parametri:

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

Forzare il piano a non essere né memorizzato nella cache né riutilizzato:

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

Per ulteriori informazioni, vedere [https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-query.html](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-query.html) execute-open-cypher-query nel Command Reference. AWS CLI 

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

Per esempi di AWS SDK in altre lingue, consulta. [AWS SDK](access-graph-opencypher-sdk.md)

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

Forzare la memorizzazione nella cache o il riutilizzo del piano:

```
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**  
Questo esempio presuppone che le AWS credenziali siano configurate nel tuo ambiente. Sostituisci {{us-east-1}} con la regione del tuo cluster Neptune.

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

Forzare la memorizzazione nella cache o il riutilizzo del piano:

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

Con parametri:

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

Forzare il piano a non essere né memorizzato nella cache né riutilizzato:

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

------

## Come determinare se un piano è memorizzato nella cache o meno
<a name="access-graph-qpc-status"></a>

 Per HTTP READ, se la query è stata inviata e il piano è stato memorizzato nella cache, `explain` mostrerebbe i dettagli relativi alla cache del piano di query. 

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

Per ulteriori informazioni, vedere [https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html) execute-open-cypher-explain-query nel Command Reference. AWS CLI 

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

Per esempi di SDK in altre lingue, consulta. AWS [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**  
Questo esempio presuppone che le tue AWS credenziali siano configurate nel tuo ambiente. Sostituisci {{us-east-1}} con la regione del tuo 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 il piano è stato memorizzato nella cache, l'`explain`output 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).
```

 Quando si utilizza Bolt, la funzione di spiegazione non è supportata. 

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

 Un piano di interrogazione viene eliminato in base al tempo di vita della cache (TTL) o quando è stato raggiunto il numero massimo di piani di interrogazione memorizzati nella cache. Quando viene raggiunto il piano di interrogazione, il TTL viene aggiornato. Le impostazioni predefinite sono: 
+  1000: il numero massimo di piani che possono essere memorizzati nella cache per istanza. 
+  TTL: 300.000 millisecondi o 5 minuti. Il pulsante della cache riavvia il TTL e lo reimposta a 5 minuti. 

## Condizioni che impediscono la memorizzazione nella cache del piano
<a name="access-graph-qpc-conditions"></a>

 La cache del piano di interrogazione non verrebbe utilizzata nelle seguenti condizioni: 

1.  Quando una richiesta viene inviata utilizzando il suggerimento `QUERY:PLANCACHE "disabled"` per la query. È possibile rieseguire la query e rimuoverla `QUERY:PLANCACHE "disabled"` per abilitare la cache del piano di query. 

1.  Se la query inviata non è una query con parametri e non contiene il suggerimento. `QUERY:PLANCACHE "enabled"` 

1.  Se il tempo di valutazione della query è superiore alla soglia di latenza, la query non viene memorizzata nella cache e viene considerata una query di lunga durata che non trarrebbe vantaggio dalla cache del piano di query. 

1.  Se la query contiene uno schema che non restituisce alcun risultato. 
   +  cioè `MATCH (n:nonexistentLabel) return n` quando ci sono zero nodi con l'etichetta specificata. 
   +  cioè `MATCH (n {name: $param}) return n` con `parameters={"param": "abcde"}` quando non ci sono nodi contenenti`name=abcde`. 

1.  Se il parametro di interrogazione è di tipo composito, ad esempio a `list` o a`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 il parametro di interrogazione è una stringa che non ha fatto parte di un'operazione di caricamento o inserimento dei dati. Ad esempio, se `CREATE (n {name: "X"})` viene eseguito per inserire`"X"`, `RETURN "X"` viene memorizzato nella cache, mentre non `RETURN "Y"` verrebbe memorizzato nella cache, poiché `"Y"` non è stato inserito e non esiste nel database. 