在 Amazon Neptune 中查询套餐缓存 - Amazon Neptune

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在 Amazon Neptune 中查询套餐缓存

将查询提交给 Neptune 时,查询字符串会被解析、优化并转换为查询计划,然后由引擎执行。应用程序通常以常见的查询模式为后盾,这些模式使用不同的值进行实例化。查询计划缓存可以通过缓存查询计划来减少总体延迟,从而避免对此类重复模式进行解析和优化。

Query Plan Cache 可用于OpenCypher查询,包括非参数化查询或参数化查询。它已为READ、HTTP和 Bolt 启用。OC 突变查询支持它。Gremlin 或SPARQL查询支持它。

如何强制启用或禁用查询计划缓存

默认情况下,查询计划缓存处于启用状态,用于低延迟参数化查询。仅当延迟低于 100 毫秒的阈值时,才会缓存参数化查询的计划。查询级别的查询提示可以在每个查询(无论是否参数化)的基础上覆盖此行为。QUERY:PLANCACHE它需要与USING子句一起使用。查询提示接受enableddisabled作为值。

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

如何确定计划是否已缓存

因为 HTTPREAD,如果查询已提交且计划已缓存,则explain将显示与查询计划缓存相关的详细信息。

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

使用 Bolt 时,不支持解释功能。

驱逐

查询计划会根据缓存存活时间 (TTL) 或已达到缓存查询计划的最大数量时被逐出。当查询计划被命中时TTL,会刷新。默认值为:

  • 1000-每个实例可以缓存的最大计划数。

  • TTL-300,000 毫秒或 5 分钟。缓存命中会重新启动TTL,并将其重置回 5 分钟。

导致计划无法缓存的情况

在以下条件下将不使用查询计划缓存:

  1. 使用查询提示提交查询时QUERY:PLANCACHE "disabled"。您可以重新运行查询并移除QUERY:PLANCACHE "disabled"以启用查询计划缓存。

  2. 如果提交的查询不是参数化查询且不包含提示。QUERY:PLANCACHE "enabled"

  3. 如果查询评估时间大于延迟阈值,则该查询不会被缓存,并且被视为长时间运行的查询,不会从查询计划缓存中受益。

  4. 如果查询包含不返回任何结果的模式。

    • 也就是说,MATCH (n:nonexistentLabel) return n当具有指定标签的节点为零时。

    • 也就是说MATCH (n {name: $param}) return nparameters={"param": "abcde"}当包含零个节点时name=abcde

  5. 如果查询参数是复合类型,例如 a list 或 a 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. 如果查询参数是一个未参与数据加载或数据插入操作的字符串。例如,如果CREATE (n {name: "X"})运行插入"X"RETURN "X"RETURN "Y"会被缓存,而不会被缓存,因为"Y"尚未插入且数据库中不存在。