2017-03-29 2 views
0

これらのソリューションのいずれかが客観的に優れているのか、それともすべてデータに依存していますか? Explainオプションは、実際には、オプティマイザがクエリを別の方法で実行することを示しています。これは単なる例です。私はアプリケーションでこのようなクエリをたくさん用意しています。そのようなフィルタリングを実行する最適な方法を知りたいと思います。グラフクエリ - どこから選択して展開するか

SELECT * 
FROM 
    (SELECT expand(in('hasPermission')) 
    FROM Permission 
    WHERE type IN ['USER']) 
WHERE 
    login >="admin" 
ORDER BY 
    login ASC 
LIMIT 3 

SELECT * 
FROM User 
WHERE login >= "admin" 
    AND out("hasPermission").type IN ["USER"] 
ORDER BY login ASC 
LIMIT 3 

答えて

1

これはドメインによって大きく異なります。 v 2.2のクエリ・オプティマイザは、ターゲット・クラス(第1の問合せではPermission、第2の問合せではUser)のスキャン(または索引の問合せ)を開始し、次にトラバースを開始します。

「USER」がtypeの属性を持つ権限レコードが少なく、アクセス許可あたりの着信エッジの数が少ない場合は、最初のクエリがより効率的です。 type

login> "admin"(やはりインデックスあり)のユーザーが少なく、1人のユーザーあたりの出力エッジの数が少ない場合は、2番目のクエリがより効率的です。

+0

私が疑っていたものです。クエリオプティマイザの内部動作を説明してくれてありがとうございます。 –

+0

ああ、私はこれがクエリのピボットと呼ばれることも学んだ。 2番目のクエリでは、この種のクエリに適合する複合インデックスを作成できますか? –

+0

いいえ、残念ながら、この場合は "connected"要素のインデックスは使用されません。すなわち、 Permission.typeのインデックスは2番目のクエリで使用されません –

関連する問題