Memoria caché de planes de consultas en Amazon Neptune - Amazon Neptune

Memoria caché de planes de consultas en Amazon Neptune

Cuando se envía una consulta a Neptune, la cadena de consulta se analiza, optimiza y transforma en un plan de consulta que, después, el motor ejecuta. Las aplicaciones suelen estar respaldadas por patrones de consulta comunes para los que se crean instancias con diferentes valores. La caché de planes de consultas puede reducir la latencia general al almacenar en caché los planes de consulta y, por lo tanto, evitar el análisis y la optimización de dichos patrones repetidos.

La caché de planes de consultas se puede usar para consultas de openCypher, tanto consultas parametrizadas como no parametrizadas. Está habilitada para READ, HTTP y Bolt. No es compatible con consultas de mutación de OC. No es compatible con consultas de Gremlin o SPARQL.

Cómo forzar la habilitación o deshabilitación de la caché de planes de consultas

La caché de planes de consultas está habilitada de forma predeterminada para consultas parametrizadas de baja latencia. El plan de una consulta parametrizada se almacena en caché solo cuando la latencia es inferior al umbral de 100 ms. La sugerencia de consulta QUERY:PLANCACHE en el ámbito de la consulta permite anular este comportamiento en cada consulta (parametrizada o no). Debe usarse con la cláusula USING. La sugerencia de consulta acepta como valor enabled o disabled.

# Forcing plan to be cached or reused % curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" % curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \ -d "parameters={\"arg\": 123}" # Forcing plan to be neither cached nor reused % curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"disabled\" MATCH(n) RETURN n LIMIT 1"

Cómo determinar si un plan está almacenado en caché o no

En el caso de HTTP READ, si la consulta se ha enviado y el plan se ha almacenado en caché, explain mostraría detalles relevantes sobre la caché de planes de consultas.

% curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" MATCH(n) RETURN n LIMIT 1" \ -d "explain=[static|details]" 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).

Cuando se utiliza Bolt, no se admite la característica explain.

Expulsión

Un plan de consultas se expulsa por el tiempo de vida (TTL) de la caché o cuando se alcanza el número máximo de planes de consulta almacenados en caché. Cuando se alcanza el plan de consultas, se actualiza el TTL. Los valores predeterminados son:

  • 1000: el número máximo de planes que se pueden almacenar en caché por instancia.

  • TTL: 300 000 milisegundos o 5 minutos. El acierto de la caché reinicia el TTL y lo restablece a 5 minutos.

Condiciones que impiden que el plan se almacene en caché

La caché de planes de consultas no se utilizará en las siguientes condiciones:

  1. Cuando se envía una consulta con la sugerencia de consulta QUERY:PLANCACHE "disabled". Puede volver a ejecutar la consulta y eliminar QUERY:PLANCACHE "disabled" para habilitar la caché de planes de consultas.

  2. Si la consulta enviada no es una consulta parametrizada y no contiene la sugerencia QUERY:PLANCACHE "enabled".

  3. Si el tiempo de evaluación de la consulta es superior al umbral de latencia, la consulta no se almacena en caché y se considera una consulta de larga duración que no se beneficiará de la caché de planes de consultas.

  4. Si la consulta contiene un patrón que no devuelve ningún resultado.

    • Por ejemplo, MATCH (n:nonexistentLabel) return n cuando no hay nodos con la etiqueta especificada.

    • Por ejemplo, MATCH (n {name: $param}) return n con parameters={"param": "abcde"} cuando no hay nodos que contengan name=abcde.

  5. Si el parámetro de consulta es de tipo compuesto, como list o map.

    curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \ -d "parameters={\"arg\": [1, 2, 3]}" curl -k https://<endpoint>:<port>/opencypher \ -d "query=Using QUERY:PLANCACHE \"enabled\" RETURN \$arg" \ -d "parameters={\"arg\": {\"a\": 1}}"
  6. Si el parámetro de consulta es una cadena que no ha formado parte de una operación de carga o inserción de datos. Por ejemplo, si se ejecuta CREATE (n {name: "X"}) para insertar "X", entonces RETURN "X" se almacena en caché, mientras que RETURN "Y" no se almacenará en caché, ya que "Y" no se ha insertado y no existe en la base de datos.