本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon Neptune 中查询套餐缓存
将查询提交给 Neptune 时,查询字符串会被解析、优化并转换为查询计划,然后由引擎执行。应用程序通常以常见的查询模式为后盾,这些模式使用不同的值进行实例化。查询计划缓存可以通过缓存查询计划来减少总体延迟,从而避免对此类重复模式进行解析和优化。
Query Plan Cache 可用于OpenCypher查询,包括非参数化查询或参数化查询。它已为READ、HTTP和 Bolt 启用。OC 突变查询不支持它。Gremlin 或SPARQL查询不支持它。
如何强制启用或禁用查询计划缓存
默认情况下,查询计划缓存处于启用状态,用于低延迟参数化查询。仅当延迟低于 100 毫秒的阈值时,才会缓存参数化查询的计划。查询级别的查询提示可以在每个查询(无论是否参数化)的基础上覆盖此行为。QUERY:PLANCACHE
它需要与USING
子句一起使用。查询提示接受enabled
或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"
如何确定计划是否已缓存
因为 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 分钟。
导致计划无法缓存的情况
在以下条件下将不使用查询计划缓存:
-
使用查询提示提交查询时
QUERY:PLANCACHE "disabled"
。您可以重新运行查询并移除QUERY:PLANCACHE "disabled"
以启用查询计划缓存。 -
如果提交的查询不是参数化查询且不包含提示。
QUERY:PLANCACHE "enabled"
-
如果查询评估时间大于延迟阈值,则该查询不会被缓存,并且被视为长时间运行的查询,不会从查询计划缓存中受益。
-
如果查询包含不返回任何结果的模式。
-
也就是说,
MATCH (n:nonexistentLabel) return n
当具有指定标签的节点为零时。 -
也就是说
MATCH (n {name: $param}) return n
,parameters={"param": "abcde"}
当包含零个节点时name=abcde
。
-
-
如果查询参数是复合类型,例如 a
list
或 amap
。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}}"
-
如果查询参数是一个未参与数据加载或数据插入操作的字符串。例如,如果
CREATE (n {name: "X"})
运行插入"X"
,RETURN "X"
则RETURN "Y"
会被缓存,而不会被缓存,因为"Y"
尚未插入且数据库中不存在。