View a markdown version of this page

Cache del piano di query in Amazon Neptune - Amazon Neptune

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

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

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

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

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

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'explainoutput 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

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

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.

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

  3. 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.

  4. 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 contenentiname=abcde.

  5. Se il parametro di interrogazione è di tipo composito, ad esempio a list o amap.

    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}}"
  6. 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.