Запрос хранилища данных не работает, запрашивает больше индекса, чем ожидалось

<datastore-index kind="Environment" ancestor="false">
    <property name="active" direction="asc" />
    <property name="consumed" direction="asc" />
</datastore-index>

<datastore-index kind="Environment" ancestor="false">
    <property name="active" direction="asc" />
    <property name="creationDate" direction="desc" />
</datastore-index>

У меня есть два вышеуказанных индекса

Когда я запрашиваю следующее, он не работает и говорит, что требуется новый индекс.

SELECT * FROM Среда, в которой active = false и потребляется = true и creationDate <'2013-09-22'

GQL ответ выглядит следующим образом:

соответствующий индекс не найден. Рекомендуемый индекс для этого запроса:

<datastore-index kind="Environment" ancestor="false">
   <property name="active" direction="asc" />
   <property name="consumed" direction="asc" />
   <property name="creationDate" direction="asc" />
</datastore-index>

Что я делаю неправильно? Разве это не должно работать на основе зигзагообразного слияния?

1 ответ

Решение

Если посмотреть, какие индексы нужны для зигзагообразных запросов, очень полезно разделить индексы на префиксы и постфиксы. Префикс индекса используется для ответа на равенства, в то время как постфикс используется для ответа на неравенства и сортировку.

Чтобы выполнить объединение слиянием, постфикс всех индексов, задействованных в запросе, должен совпадать, чтобы порядки сортировки были одинаковыми. Так что в случае вашего запроса:

SELECT * FROM Environment where active = false and consumed = true and creationDate < '2013-09-22'

creationDate должен быть в постфиксе; active а также consumed должен быть в префиксе.

Индекс:

<datastore-index kind="Environment" ancestor="false">
   <property name="active" direction="asc" />
   <property name="consumed" direction="asc" />
   <property name="creationDate" direction="asc" />
</datastore-index>

может удовлетворить это требование, если мы разделим индекс на префикс и постфикс между consumed а также creationDate, Однако вы также можете удовлетворить это двумя отдельными индексами:

<datastore-index kind="Environment" ancestor="false">
   <property name="active" direction="asc" />
   <property name="creationDate" direction="asc" />
</datastore-index>

<datastore-index kind="Environment" ancestor="false">
   <property name="consumed" direction="asc" />
   <property name="creationDate" direction="asc" />
</datastore-index>

В этом случае постфикс будет содержать creationDate и префикс будет active а также consumedсоответственно. Обратите внимание, что в этом случае постфиксы совпадают в обоих индексах, что является обязательным условием для выполнения зигзагообразного объединения слиянием.

Для тех индексов, которые у вас есть, на запрос нельзя ответить, потому что

<datastore-index kind="Environment" ancestor="false">
    <property name="active" direction="asc" />
    <property name="consumed" direction="asc" />
</datastore-index>

не имеет creationDate как постфикс.

Другие вопросы по тегам