次の方法で共有


ベスト プラクティス: インデックス作成、AGE EXPLAIN、およびデータ読み込みベンチマーク

Azure Database for PostgreSQL でサポートされている Apache AGE では、高度なグラフ処理とクエリのサポートが提供されます。 ただし、最適なクエリ パフォーマンスを実現するには、インデックス作成とデータ読み込みに関する慎重な戦略が必要です。 このガイドでは、最近のベンチマーク結果と技術的な分析情報に基づいて、いくつかのベスト プラクティスについて説明します。

Apache AGE でのインデックス作成

インデックス作成は、特にグラフ データベースのクエリ パフォーマンスを向上させるために極めて重要です。

既定の動作

既定では、Apache AGE では、新しく作成されたグラフのインデックスは作成されません。 そのため、クエリとデータセットの性質に基づいてインデックスを明示的に作成する必要があります。

WHERE 句

Apache AGE では、次のクエリの評価方法が異なります。

SELECT * FROM cypher('graph_name',
 $$
 MATCH (n:Customer {Name:'Alice'}) RETURN n
 $$)
AS (n agtype);
SELECT * FROM cypher('graph_name',
 $$
 MATCH (n:Customer) WHERE n.Name='Alice' RETURN n
 $$)
AS (n agtype);

インデックス作成を最大限に活用するには、WHERE 句の有無に関係なくクエリで使用されるインデックスの種類を理解する必要があります。

Apache AGE での EXPLAIN

標準 SQL とは異なり、暗号クエリの EXPLAIN キーワードには異なるクエリ形式が必要です。

SELECT * FROM cypher('graph_name',
 $$
 EXPLAIN
 MATCH (n:Customer)
 WHERE n.Name='Alice'
 RETURN n
 $$)
AS (plan text);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..418.51 rows=43 width=32)
Filter: (agtype_access_operator(VARIADIC ARRAY[properties, '"Name"'::agtype]) = '"Alice"'::agtype)

WHERE 句のないクエリ プランの違いを確認するには:

SELECT * FROM cypher('graph_name',
 $$
 MATCH (n:Customer {Name:'Alice'}) RETURN n
 $$)
AS (n agtype);
QUERY PLAN
---------------------------------------------------------------
Seq Scan on "Customer" n (cost=0.00..396.56 rows=9 width=32)
Filter: (properties @> '{"Name": "Alice"}'::agtype)

一般的なインデックスの種類

  • BTREE インデックス: 完全一致と範囲クエリに対して有効です。 エッジ テーブルや頂点テーブルの ID、start_id、end_idなどの列で使用することをお勧めします。
  • GIN インデックス: JSON フィールドに便利で、プロパティ列のキーと値のペアを効率的に検索できます。

次のコマンドを使用して、頂点テーブルとエッジ テーブルのインデックスを作成します。

  • 頂点テーブル:

    CREATE INDEX ON graph_name."VLABEL" USING BTREE (id);
    CREATE INDEX ON graph_name."VLABEL" USING GIN (properties);
    
  • Microsoft Edge テーブル:

    CREATE INDEX ON graph_name."ELABEL" USING BTREE (id);
    CREATE INDEX ON graph_name."ELABEL" USING GIN (properties);
    
    CREATE INDEX ON graph_name."ELABEL" USING BTREE (start_id);
    CREATE INDEX ON graph_name."ELABEL" USING BTREE (end_id);
    

プロパティ内の特定のキー値のインデックス作成

対象クエリの場合、プロパティ列内の特定のキーに対して、より小さく効率的な BTREE インデックスを作成できます。

CREATE INDEX ON graph_name.label_name USING BTREE (agtype_access_operator(VARIADIC ARRAY[properties, '"KeyName"'::agtype]));

この方法では、不要なデータのインデックス作成を回避し、効率を向上します。

EXPLAIN を使用してプランの分析情報を照会する

EXPLAIN キーワードは、クエリがインデックスを使用する方法を示します。 すべてのクエリでインデックスが自動的に使用されるわけではありません。特に WHERE 句なしで発行されるクエリです。 EXPLAIN を使用してインデックスの使用状況を確認し、それに応じてクエリを最適化します。

ベンチマークの観測値

最近のテストでは、インデックス作成がクエリのパフォーマンスに与える影響が強調されています。

インデックス付きクエリとインデックスなしクエリ

このセクションでは、インデックス付きクエリとインデックスなしクエリのパフォーマンスの違いについて説明します。

  • シーケンシャル スキャンは、テーブル全体を取得するクエリのインデックス スキャンよりも優れたパフォーマンスを発揮します。
  • インデックス作成により、結合クエリのパフォーマンスが大幅に向上します (リレーションシップ数など)。

データ読み込みのベスト プラクティス

大規模なデータセットでは、効率的なデータ読み込みが不可欠です。

AGEFreighter ライブラリは、データ インジェストの合理化されたプロセスを提供します。

AGEFreighter を使用したデータの読み込み

AGEFreighter は、Apache AGE へのデータの読み込みを容易にするために設計された Python ライブラリです。 CSV、Avro、Parquet など、さまざまなデータ形式をサポートし、AGE グラフにデータを読み込むための簡単なインターフェイスを提供します。

環境のセットアップ

  • AGE が有効になっている Azure Database for PostgreSQL フレキシブル サーバーを作成しました。
  • 詩などの Python 依存関係管理ツールをお勧めします。 Python 3.9 以降をインストールする必要があります。
  • AGEFreighter ライブラリ (AGEFreighter PyPi) を依存関係としてインストールする必要があります。
poetry add agefreighter

ベンチマークに CSV データ形式を使用する

ベンチマークでは、CSVファイルを使用してAGEにデータを読み込んだ。 CSV 形式は広くサポートされており、簡単に操作できるため、データ読み込みタスクに適しています。

使用されるデータセットは訴訟とそれらの関係で構成されているため、入力 CSV ファイルを次のように構造化しました。

id,CaseID,start_vertex_type,end_CaseID,end_vertex_type
1,1005631,Case,5030916,Case
2,1005631,Case,5028652,Case
3,1005631,Case,996512,Case
4,1005631,Case,3413065,Case
5,1005631,Case,4912975,Case

各行は、2 つのケース間のリレーションシップを表します。 CaseID は開始ケース ノードを参照し、end_CaseIDは接続されたケースを参照します。

ベンチマークにデータ読み込みスクリプトを使用する

次の Python スクリプトは、データセットを AGE に読み込むのに使用されました。 別の例については、AGEFreighter PyPi の「CSVFreighter の使用」セクションを参照することもできます。

await instance.load(
 graph_name="CaseGraphFull",
 start_v_label="Case",
 start_id="CaseID",
 start_props=[],
 edge_type="REF",
 edge_props=[],
 end_v_label="Case",
 end_id="end_CaseID",
 end_props=[],
 csv_path="./cases.csv",
 use_copy=True,
 drop_graph=True,
 create_graph=True,
 progress=True,
)

ご覧のように、指定された csv ファイルのgraph_nameとフィールドはここで定義されています。 use_copy=True パラメーターを指定すると、効率的なデータ読み込みが保証されます。 drop_graph=True および create_graph=True パラメーターは、新しいデータを読み込む前に新しい開始を保証します。

その他のデータ ソース

AGEFreighter では、データ形式の要件に基づいて調整できる MultiCSV、Avro、Parquet、Azure Storage などの他の形式がサポートされています。 詳細については、「AGEFreighter PyPi」を参照してください。

データ読み込みパフォーマンス ベンチマーク

  • データセット サイズ: 725,000 ケース、2.8M リレーションシップ。
  • 読み込み時間: 83 秒。

大規模なデータセットを効果的に処理するためには、効率的なデータ読み込みが不可欠です。

大きなファイルに適していますが、準備時間が原因で、このプロセスはデータセットのサイズが小さいほど効果が低くなる可能性があります。