6.9.2.2 PGQL問合せでのパフォーマンスの考慮事項
次に、問合せのパフォーマンスのためのお薦めの慣例をいくつか示します。
再帰的問合せ
再帰的問合せの実行を高速化するために、次の索引をお薦めします。
- 再帰パターンの基礎となるVERTEX表の場合、キー列の索引
- 再帰パターンの基礎となるEDGE表の場合、ソース・キー列の索引
ノート:
(ソース・キー, 宛先キー)に索引を作成することもできます。
たとえば、次のCREATE PROPERTY GRAPH文について考えてみます。
CREATE PROPERTY GRAPH people
VERTEX TABLES(
person
KEY ( id )
LABEL person
PROPERTIES( name, age )
)
EDGE TABLES(
knows
key (person1, person2)
SOURCE KEY ( person1 ) REFERENCES person
DESTINATION KEY ( person2 ) REFERENCES person
NO PROPERTIES
)
OPTIONS ( PG_VIEW )
また、次の問合せも考えてみます。
SELECT COUNT(*)
FROM MATCH ANY SHORTEST ( (n:Person) -[e:knows]->* (m:Person) )
WHERE n.id = 1234
前述の問合せの再帰的部分のパフォーマンスを向上させるには、次の索引が存在する必要があります。
CREATE INDEX <INDEX_NAME> ON PERSON(ID)
CREATE INDEX <INDEX_NAME> ON KNOWS(PERSON1)
またはCREATE INDEX <INDEX_NAME> ON KNOWS(PERSON1, PERSON2)
コンポジット頂点キー
コンポジット頂点キーの場合、キー列にファンクション索引を作成することで、問合せの実行を最適化できます。
- 再帰パターンの基礎となるVERTEX表の場合、カンマ区切りのキー列の連結に対するファンクション索引
- 再帰パターンの基礎となるEDGE表の場合、カンマ区切りのソース・キー列の連結に対するファンクション索引
ノート:
(ソース・キー列, 宛先キー列)に索引を作成することもできます。
たとえば、次のCREATE PROPERTY GRAPH文について考えてみます。
CREATE PROPERTY GRAPH people
VERTEX TABLES(
person
KEY ( id1, id2 )
LABEL person
PROPERTIES( name, age )
)
EDGE TABLES(
knows
key (id)
SOURCE KEY ( id1person1, id2person1 ) REFERENCES person
DESTINATION KEY ( id1person2, id2person2 ) REFERENCES person
NO PROPERTIES
)
OPTIONS ( PG_VIEW )
また、次の問合せも考えてみます。
SELECT COUNT(*)
FROM MATCH ANY SHORTEST ( (n:Person) -[e:knows]->* (m:Person) )
WHERE n.id = 1234
前述の問合せの再帰的部分のパフォーマンスを向上させるには、次の索引が存在する必要があります。
CREATE INDEX <INDEX_NAME> ON PERSON (ID1 || ',' || ID2)
CREATE INDEX <INDEX_NAME> ON KNOWS (ID1PERSON1 || ',' || ID2PERSON1)
またはCREATE INDEX <INDEX_NAME> ON KNOWS (ID1PERSON1 || ',' || ID2PERSON1, ID1PERSON2 || ',' || ID2PERSON2)
コンポジット頂点キーの一部の列が文字列列である場合、その列は、ファンクション索引の作成でカンマをエスケープする必要があります。
たとえば、前述の例の表PERSON
の列ID1
の型がVARCHAR2(10)
の場合、次のように列のカンマをエスケープする必要があります。
replace(ID1, ',', '\,')
そのため、パフォーマンスを向上させるための索引は次のようになります。
CREATE INDEX <INDEX_NAME> ON PERSON (replace(ID1, ',', '\,') || ',' || ID2)
CREATE INDEX <INDEX_NAME> ON KNOWS (replace(ID1PERSON1, ',', '\,') || ',' || ID2PERSON1)
親トピック: プロパティ・グラフ・ビューに対するPGQL問合せの実行