Firestore медленные запросы с большими коллекциями, если автономное сохранение не отключено - PullRequest
0 голосов
/ 04 мая 2018

Я использую Firestore Recycler Adapter для привязки к запросу большой коллекции в firestore.

Как я понимаю, документы в GitHub, адаптер утилиты Firestore Recycler использует .addSnapshotListener (), а не метод .get ().

Коллекция содержит 5000 документов, из которых я ограничу только 100.

Query query = fsDB.collection("Users").document(user_id).collection("posts")
.orderBy("date_created).orderBy("topic").limit(100);

Теперь, когда я подключен к Интернету и когда автономное постоянство включено, этот запрос занимает в среднем 90 секунд, прежде чем вызывается onDataChanged (). Я думаю, это потому, что переработчик получает данные из памяти или кеша на устройстве, а затем сортирует их (!) Перед получением данных из сети.

ПОТОМУ ЧТО, когда автономное сохранение отключено, запрос занимает всего 2-3 секунды.

Как я могу использовать этот запрос, чтобы он был быстрее, когда включено автономное сохранение? Или есть способ сделать так, чтобы слушатель обращался к сетевым индексам перед поиском в памяти / кэше?

Что-то вроде ...

FirestoreRecyclerOptions<Reed> options = new FirestoreRecyclerOptions.Builder<>()
.setQuery(query, Reed.class)
.setFirst(FirebaseFirestore.getInstance fsDB);

Доступны ли индексы пожарного магазина на стороне клиента?

Использование firestore 15.0.0, устройство Android

Ответы [ 2 ]

0 голосов
/ 12 июля 2018

@ Ответ Дуга Стивенсона (плюс комментарии) объясняет причину, но в качестве решения я бы предложил гибридный подход. Поддерживайте свою собственную локальную кэш-память БД или ORM с нужными индексами и, возможно, своей собственной схемой удаления / ограничения кэша.

Используйте встроенное постоянство Firestore для возможностей синхронизации и добавьте прослушиватель моментальных снимков для запуска обновления вашего автономного кэша. У вас есть несколько вариантов оптимизации: от , проверяющих только дельту , до использования snapshot.getMetadata().hasPendingWrites() для запуска только при наличии онлайн / свежих данных.

И, конечно, вы все равно можете реализовать поведение обновления по требованию в вашем пользовательском интерфейсе.

Этот подход должен обеспечить вам (самонастраивающуюся) производительность в автономном режиме, которая вам требуется, при этом сохраняя преимущества серверной части Firestore.

0 голосов
/ 04 мая 2018

Автономные запросы не оптимизируются так, как если бы приложение было в сети. Быстрые запросы являются функцией бэкэнда Firestore, которая, очевидно, недоступна в автономном режиме.

См. Также: Насколько надежен Firestore как механизм автономного хранения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...