у меня есть проблемы с пониманием пути плана couchbase запрос работает. Я использую SpringData с Couchbase 4.1, и я предоставляю собственную реализацию репозитория Couchbase. Внутри моего пользовательского implememtnation из Couchbase Repository У меня есть ниже метод: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);
В результате Spring Data производит следующий объект JSON представлен запрос на Couchbase:
{
"$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 я просто заменяю ссылки параметров точными значениями.
После добавления EXPLAIN пункта перед тем отборным заявлением я упомянул различные планы выполнения. Выполнение этого запроса в параметризованном запросе через Java Spring Data или N1QL Rest Api. Я упомянул, что в запросе не используется индекс, который я создал именно для этого случая. Индекс Definiton можно найти ниже:
CREATE INDEX `testMembers` ON MyDatabase `m`(`_class`,`segmentId`,`executionTime`) WHERE (`_class` = "path/MyClass") USING GSI;
Так что, когда я выполнить запрос с помощью CBQ Consol, Couchbase использует мой idnex и производительность запросов очень хорошо. Но когда я выполняю этот запрос через N1QL rest api или Java, я вижу, что этот запрос не использует мой индекс. Ниже вы можете найти часть плана исполнения, что подтверждает этот факт:
"~children": [
{
"#operator": "PrimaryScan",
"index": "#primary",
"keyspace": "CSM",
"namespace": "default",
"using": "gsi"
},
Итак, вопрос заключается в том, что право и правовое поведение оптимизатора couchbase запроса? И означает ли это, что в плане запроса не учитываются реальные значения параметров? И нужно ли вручную вставлять значения в строку запроса или использовать другой способ использования параметризованного запроса N1Ql с правильным выбором индекса?
EDIT
Согласно Шаш Раджа ответа АПЧРК (ложь) параметр для параметризованного запроса N1QL добавить N1qlParams.build().. Это не решает мою проблему, потому что у меня все еще есть проблемы с производительностью с этим запросом. Более того, когда я печатаю запрос, я вижу, что он такой же, как я описал ранее. Таким образом, мой запрос все еще ошибочно анализируется и приводит к снижению производительности.
Вы можете попробовать Couchbase 4.5.1, чтобы увидеть, если это было исправлено. – geraldss
Нет, это не исправлено даже в 4.6 – gaperton
И, видимо, нечего исправить :). См. Мой ответ ниже. – gaperton