Нет эффективного способа сделать это - ни в одной СУБД. В любом случае вы должны по крайней мере последовательно читать записи индекса, пока не найдете n-ную, а затем найти соответствующую запись данных. Это более или менее то, что fetch (count, offset) делает в GAE с дополнительным ограничением в 1000 записей.
Лучшим подходом к этому является сохранение «закладки», состоящей из значения поля, в котором вы упорядочиваете последнюю полученную вами сущность, и ее ключа. Затем, когда вы хотите продолжить с того места, на котором остановились, вы можете добавить значение поля в качестве нижней границы запроса неравенства и пропустить записи, пока не совпадете или не превысите последний, который вы видели.
Если вы хотите предоставить «дружественные» смещения страниц пользователям, вы можете использовать memcache для хранения связи между начальным смещением и кортежем закладки (order_property, key). Когда вы создаете страницу, вставьте или обновите закладку для сущности, следующей за последней. При извлечении страницы используйте закладку, если она существует, или сгенерируйте ее сложным способом, выполняя запросы со смещениями - возможно, несколько запросов, если смещение достаточно велико.