Запрос хранилища данных не работает, запрашивает больше индекса, чем ожидалось
<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
как постфикс.