couchbaseクエリプランの仕組みの理解に問題があります。 SpringDataをCouchbase 4.1で使用し、Couchbaseリポジトリのカスタム実装を提供します。私は法の下に持っているCouchbaseのリポジトリの私のカスタムimplememtnation内部:結果でCouchbaseはN1QLのパラメータ化クエリで間違ったインデックスを使用します
String queryAsString = "SELECT MyDatabase.*, META().id as _ID, META().cas as _CAS FROM MyDatabase WHERE segmentId = $id AND _class = $class ORDER BY executionTime DESC LIMIT 1";
JsonObject params = JsonObject.create()
.put(CLASS_VARIABLE, MyClass.class.getCanonicalName())
.put(ID_VARIABLE, segmentId);
N1qlQuery query = N1qlQuery.parameterized(queryAsString, params);
List<MyClass> resultList = couchbaseTemplate.findByN1QL(query, SegmentMembers.class);
return resultList.isEmpty() ? null : resultList.get(0);
、春データはCouchbaseのにクエリを表し、次のJSONオブジェクトを生成します。私は、実行時に
{
"$class":"path/MyClass",
"statement":"SELECT MyDatabase.*, META().id as _ID, META().cas as _CAS from MyDatabase where segmentId = $id AND _class = $class ORDER BY executionTime DESC LIMIT 1",
"id":"6592c16a-c8ae-4a74-bc17-7e18bf73b3f8"
}
そして、問題はパフォーマンスでありますそれはJavaとN1QL Rest APIを介して、またはcbqコンソール経由で。このクエリをcbqで実行するには、パラメータ参照を正確な値に置き換えます。
selectステートメントの前にEXPLAIN句を追加した後、私は別の実行計画を述べました。 JavaのSpringデータまたはN1QLのRest APIを使用して、このクエリをパラメータ化されたクエリとして実行しました。このケースでは、クエリで作成したインデックスは使用されません。インデックスdefinitonは以下見つけることができます:
CREATE INDEX `testMembers` ON MyDatabase `m`(`_class`,`segmentId`,`executionTime`) WHERE (`_class` = "path/MyClass") USING GSI;
私はCBQ卓を経由してクエリを実行すると、そう、Couchbaseのが私のidnexを使用すると、クエリのパフォーマンスは非常に良いです。しかし、N1QLの残りのAPIまたはJavaを介してこのクエリを実行すると、そのクエリがインデックスを使用しないことがわかります。あなたはこの事実を証明する実行計画の一部で見ることができます:だから
"~children": [
{
"#operator": "PrimaryScan",
"index": "#primary",
"keyspace": "CSM",
"namespace": "default",
"using": "gsi"
},
を、質問はその権利とCouchbaseのクエリオプティマイザの法的な挙動がありますか?クエリプランではパラメータの実際の値が考慮されないということですか?そして、私は手動でクエリ文字列に値を入れたり、正しいインデックス選択でN1Qlのパラメータ化されたクエリを使用するために他の方法で存在していますか?
EDIT
シャシのラジの答えによると、私は(N1qlParams.buildを追加)N1QLクエリをパラメータ化する。アドホック(偽)パラメータ。私はまだこのクエリでパフォーマンスの問題があるので、これは私の問題を解決しません。さらに、私がクエリを印刷するとき、私は以前に説明したのと同じことが分かります。だから、私のクエリはまだ間違って分析し、パフォーマンスの低下を引き起こします。
あなたは、これが修正されているかどうかを確認するためにCouchbaseの4.5.1を試すことができます。 – geraldss
ナー、それは4.6で固定されていない – gaperton
そして明らかに、修正するものはありません。下の私の答えを見てください。 – gaperton