View a markdown version of this page

Plan-Cache in Amazon Neptune abfragen - Amazon Neptune

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Plan-Cache in Amazon Neptune abfragen

Wenn eine Abfrage an Neptune gesendet wird, wird die Abfragezeichenfolge analysiert, optimiert und in einen Abfrageplan umgewandelt, der dann von der Engine ausgeführt wird. Anwendungen basieren häufig auf gängigen Abfragemustern, die mit unterschiedlichen Werten instanziiert werden. Der Abfrageplan-Cache kann die Gesamtlatenz reduzieren, indem er die Abfragepläne zwischenspeichert und so das Parsen und Optimieren für solche sich wiederholenden Muster vermeidet.

Der Abfrageplan-Cache kann für OpenCypherAbfragen verwendet werden — sowohl für nicht parametrisierte als auch für parametrisierte Abfragen. Es ist für READ sowie für HTTP und Bolt aktiviert. Es wird für OC-Mutationsabfragen nicht unterstützt. Es wird für Gremlin- oder SPARQL-Abfragen nicht unterstützt.

Wie erzwingt man die Aktivierung oder Deaktivierung des Abfrageplan-Caches

Der Abfrageplan-Cache ist standardmäßig für parametrisierte Abfragen mit niedriger Latenz aktiviert. Ein Plan für eine parametrisierte Abfrage wird nur zwischengespeichert, wenn die Latenz unter dem Schwellenwert von 100 ms liegt. Dieses Verhalten kann pro Abfrage (parametrisiert oder nicht) durch den Abfragehinweis auf Abfrageebene außer Kraft gesetzt werden. QUERY:PLANCACHE Es muss zusammen mit der Klausel verwendet werden. USING Der Abfragehinweis akzeptiert enabled oder disabled als Wert.

AWS CLI

Erzwingen, dass der Plan zwischengespeichert oder wiederverwendet wird:

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"

Mit Parametern:

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

Erzwingen, dass der Plan weder zwischengespeichert noch wiederverwendet wird:

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"

Weitere Informationen finden Sie execute-open-cypher-queryin der AWS CLI Befehlsreferenz.

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'])

AWS SDK-Beispiele in anderen Sprachen finden Sie unterAWS SDK.

awscurl

Erzwingen, dass der Plan zwischengespeichert oder wiederverwendet wird:

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

In diesem Beispiel wird davon ausgegangen, dass Ihre AWS Anmeldeinformationen in Ihrer Umgebung konfiguriert sind. Ersetze es us-east-1 durch die Region deines Neptun-Clusters.

curl

Erzwingen, dass der Plan zwischengespeichert oder wiederverwendet wird:

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

Mit Parametern:

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

Erzwingen, dass der Plan weder zwischengespeichert noch wiederverwendet wird:

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

Wie kann man feststellen, ob ein Plan zwischengespeichert ist oder nicht

Wenn bei HTTP READ die Anfrage eingereicht und der Plan zwischengespeichert wurde, explain würden Details angezeigt, die für den Abfrageplan-Cache relevant sind.

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

Weitere Informationen finden Sie unter execute-open-cypher-explain-query in der AWS CLI Befehlsreferenz.

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

AWS SDK-Beispiele in anderen Sprachen finden Sie unterAWS 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"
Anmerkung

In diesem Beispiel wird davon ausgegangen, dass Ihre AWS Anmeldeinformationen in Ihrer Umgebung konfiguriert sind. Ersetze es us-east-1 durch die Region deines Neptun-Clusters.

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

Wenn der Plan zwischengespeichert wurde, zeigt die explain Ausgabe:

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

Bei Verwendung von Bolt wird die Erklärungsfunktion nicht unterstützt.

Räumung

Ein Abfrageplan wird aufgrund der Gültigkeitsdauer des Caches (TTL) gelöscht oder wenn eine maximale Anzahl von zwischengespeicherten Abfrageplänen erreicht wurde. Wenn der Abfrageplan erreicht wird, wird die TTL aktualisiert. Die Standardwerte sind:

  • 1000 — Die maximale Anzahl von Plänen, die pro Instanz zwischengespeichert werden können.

  • TTL — 300.000 Millisekunden oder 5 Minuten. Der Cache-Treffer startet die TTL neu und setzt sie auf 5 Minuten zurück.

Bedingungen, die dazu führen, dass der Plan nicht zwischengespeichert wird

Der Abfrageplan-Cache würde unter den folgenden Bedingungen nicht verwendet werden:

  1. Wenn eine Abfrage mithilfe des Abfragehinweises gesendet wirdQUERY:PLANCACHE "disabled". Sie können die Abfrage erneut ausführen und entfernen, QUERY:PLANCACHE "disabled" um den Abfrageplan-Cache zu aktivieren.

  2. Wenn es sich bei der übermittelten Abfrage nicht um eine parametrisierte Abfrage handelt und sie den Hinweis nicht enthält. QUERY:PLANCACHE "enabled"

  3. Wenn die Abfrageauswertungszeit den Latenzschwellenwert überschreitet, wird die Abfrage nicht zwischengespeichert und als Abfrage mit langer Laufzeit betrachtet, für die der Abfrageplan-Cache nicht von Vorteil wäre.

  4. Wenn die Abfrage ein Muster enthält, das keine Ergebnisse zurückgibt.

    • dh MATCH (n:nonexistentLabel) return n wenn es keine Knoten mit dem angegebenen Label gibt.

    • d.h. MATCH (n {name: $param}) return n parameters={"param": "abcde"} wenn es keine Knoten gibt, die enthaltenname=abcde.

  5. Wenn der Abfrageparameter ein zusammengesetzter Typ ist, z. B. a list oder 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}}"
  6. Wenn der Abfrageparameter eine Zeichenfolge ist, die nicht Teil eines Datenlade- oder Dateneinfügevorgangs war. Wird CREATE (n {name: "X"}) beispielsweise ausgeführt, um einzufügen"X", dann RETURN "X" wird es zwischengespeichert, RETURN "Y" würde aber nicht zwischengespeichert werden, da es nicht eingefügt wurde und nicht in der Datenbank vorhanden "Y" ist.