本文へスキップ
BecomeCoder

Neo4jコース · 第8章 実践とエコシステム · レッスン44

遅いクエリを調べる ― EXPLAIN / PROFILE

ローカル実施

導入

クエリが思ったより遅いとき、「実際にどう実行されているか」を確認できると、原因の見当がつけやすくなります。Neo4jには、そのための2つのキーワードが用意されています。

説明

クエリの先頭に EXPLAIN をつけると、そのクエリを実際には実行せず、Neo4jがどのような手順(実行計画)で処理するつもりかだけを表示してくれます。

EXPLAIN
MATCH (p:Person {name: 'Alice'})-[:ACTED_IN]->(m:Movie)
RETURN m.title

PROFILE をつけると、クエリを実際に実行したうえで、各処理ステップで何件のデータに触れたか(実測値)まで表示してくれます。

PROFILE
MATCH (p:Person {name: 'Alice'})-[:ACTED_IN]->(m:Movie)
RETURN m.title
flowchart LR
    E["EXPLAIN<br/>実行計画だけ見る<br/>(実行はしない)"]
    P["PROFILE<br/>実際に実行して<br/>実測件数も見る"]

実行計画を見るときにまず注目したいのが、ノードを探す最初のステップです。第7章で学んだインデックスが効いていれば「NodeIndexSeek」のような、狙ったノードだけを直接見つける処理が表示されます。逆にインデックスが効いておらず、:Person ラベルを持つすべてのノードを1つずつ調べる「NodeByLabelScan」のような処理になっていると、データが増えたときに遅くなる原因になります。

クエリが遅いと感じたときの基本的な調べ方は、次の手順です。

  1. PROFILE をつけて実行し、どのステップで処理件数が多くなっているかを確認する。
  2. 件数が多いステップの手前で、絞り込み条件(WHERE やパターンの条件)をもっと早い段階にかけられないか検討する。
  3. よく検索に使うプロパティに、第7章で学んだインデックスが張られているか確認する。

EXPLAINPROFILE は、Cypherを書くときの「デバッガ」のような存在です。慣れてきたら、複雑なクエリを書いた後は一度 PROFILE で覗いてみる習慣をつけると、パフォーマンスの勘所が身についていきます。