Вам не нужно получать все.
Например:
- countall = query (X.class) .count ()
// http://groups.google.com/group/objectify-appengine/browse_frm/thread/3678cf34bb15d34d/82298e615691d6c5?lnk=gst&q=count#82298e615691d6c5
- rnd = Создать случайное число [0..countall]
- ofy.query (X.class) .order ("- дата"). Limit (rnd); // например -дата или какое-то хроническое индексированное поле
- Последний идентификатор ваш ...
(в среднем вы набираете 50% или, по крайней мере, первое чтение в среднем на 50% меньше)
Улучшения (чтобы иметь меньшую таблицу ключей в кеше)!
После первого прочтения запомните все элементы X.
Кэширование id-ов и их позиции. Поэтому в следующий раз условие запроса от выбранного идентификатора будет дальше (максимум ".limit (rnd% X)" будет X-1).
Случайный случай - просто случайный, если он не должен быть близким к 100% справедливому, предположите значение хронического поля (например, если у вас есть 1000 записей за 10 дней, для случайных 501 выберите второй элемент больше пятого дня).
Другие варианты, если у вас есть хроническая дата поля (или аналогичная), выборка элементов старше, чем случайная дата и младше, чем случайная дата + 1 (вам нужно знать первую дату и последнюю дату). Во-вторых выберите случайных между извлеченными записями. Если запрос пуст, выберите больше, чем etc ...