Amazon Neptune のクエリプランキャッシュ
クエリが Neptune に送信されると、クエリ文字列が解析、最適化され、クエリプランに変換されて、エンジンによって実行されます。アプリケーションは、多くの場合に、異なる値でインスタンス化された一般的なクエリパターンによってバックアップされます。クエリプランキャッシュは、クエリプランをキャッシュすることで全体的なレイテンシーを低減し、このような繰り返しパターンの解析と最適化を回避できます。
クエリプランキャッシュは、パラメータ化されていないクエリとパラメータ化されたクエリの両方の 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"
プランがキャッシュに保存されているかどうかを判断する方法
HTTP READ の場合は、クエリが送信され、プランがキャッシュに保存されると、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 が更新されます。デフォルトは次のとおりです。
-
1,000 – インスタンスごとにキャッシュに保存できるプランの最大数。
-
TTL – 300,000 ミリ秒または 5 分。キャッシュヒットは TTL を再起動し、5 分にリセットします。
プランがキャッシュに保存されない原因となる条件
クエリプランキャッシュは、次の条件下では使用されません。
-
クエリヒント
QUERY:PLANCACHE "disabled"を使用してクエリが送信された場合。クエリを再実行してQUERY:PLANCACHE "disabled"を削除し、クエリプランキャッシュを有効にできます。 -
送信されたクエリがパラメータ化されたクエリではなく、ヒント
QUERY:PLANCACHE "enabled"が含まれていない場合。 -
クエリ評価時間がレイテンシーのしきい値より長い場合、クエリはキャッシュに保存されず、クエリプランキャッシュのメリットが得られない長時間実行クエリであるとみなされます。
-
クエリに結果を返さないパターンが含まれている場合。
-
つまり、指定されたラベルを持つノードがゼロの
MATCH (n:nonexistentLabel) return nの場合です。 -
つまり、
name=abcdeを含むノードがゼロ個の場合は、parameters={"param": "abcde"}でMATCH (n {name: $param}) return nを使用します。
-
-
クエリパラメータが
listや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}}" -
クエリパラメータがデータロードまたはデータ挿入オペレーションに含まれていない文字列である場合。例えば、
CREATE (n {name: "X"})が"X"を挿入するために実行されている場合、RETURN "X"はキャッシュに保存されますが、"Y"が挿入されておらずデータベースに存在しないためRETURN "Y"はキャッシュに保存されません。