Относится только к версии Cloud Firestore Enterprise. |
Для устранения неполадок с медленными запросами используйте Query Explain , чтобы получить план выполнения запроса и профиль выполнения во время выполнения. В следующем разделе описаны шаги, которые можно предпринять для оптимизации производительности запроса в зависимости от профиля выполнения:
Ограничить количество результатов
Используйте поле «Returned Records» в дереве выполнения, чтобы определить, возвращает ли запрос много документов. Рекомендуется ограничить количество возвращаемых документов с помощью предложения $limit
. Это уменьшает размер сериализованных результатов в байтах при их возврате клиентам по сети. В случаях, когда узлу Limit
предшествует узел MajorSort
, механизм запросов может объединить узлы Limit
и MajorSort
и заменить полную материализацию и сортировку в памяти сортировкой TopN, снижая требования к памяти для запроса.
Ограничить размер результирующего документа
Рассмотрите возможность ограничения размера возвращаемого документа с помощью предложения $project
, чтобы избежать извлечения ненужных полей. Это помогает снизить затраты вычислительных ресурсов и памяти на обработку промежуточных результатов, а также размер сериализованных результатов в байтах при их возврате клиентам по сети. В случаях, когда все поля, упомянутые в запросе, покрыты обычным индексом (не многоключевым), это также позволяет полностью охватить запрос сканированием индекса, избегая необходимости извлекать документы из основного хранилища.
Использовать индексы
Используйте следующие инструкции для настройки и оптимизации индексов.
Определить, использует ли запрос индекс
Вы можете определить, использует ли запрос индекс, проверив конечные узлы в дереве выполнения. Если конечный узел дерева выполнения — это узел TableScan , это означает, что запрос не использует индекс и сканирует документы из основного хранилища. Если индекс используется, конечный узел дерева выполнения будет отображать идентификатор индекса и его поля.
Определить, можно ли оптимизировать используемый индекс
Индекс полезен для запроса, если он может сократить количество документов, которые механизму запросов необходимо извлечь из первичного хранилища, или если порядок его полей может обеспечить выполнение требования сортировки запроса.
Если для запроса используется индекс, но механизм запросов по-прежнему извлекает и отбрасывает много документов, о чём свидетельствует узел сканирования, возвращающий много записей, а затем узел фильтра , возвращающий мало записей, это признак того, что предикат запроса, удовлетворяемый с помощью индекса, не является селективным. Чтобы создать более подходящий индекс, см. раздел Создание индексов .
Если для запроса используется индекс без множественного ключа, но механизм обработки запросов всё ещё выполняет переупорядочивание набора результатов в памяти, что определяется узлом MajorSort в дереве выполнения запроса, это признак того, что используемый индекс не может быть использован для выполнения требования сортировки запроса. Чтобы создать более подходящий индекс, см. следующий раздел.
Создать индексы
Следуйте документации по управлению индексами, чтобы создать индексы . Чтобы ваш запрос мог использовать индексы, создайте обычные (не многоключевые) индексы с полями в следующем порядке:
- Все поля, которые будут использоваться в операторах равенства. Чтобы максимально увеличить вероятность повторного использования в запросах, расположите поля в порядке убывания их встречаемости в операторах равенства в разных запросах.
- Все поля, по которым будет выполнена сортировка (в том же порядке).
- Поля, которые будут использоваться в операторах диапазона или неравенства в порядке убывания селективности ограничений запроса.
- Поля, которые будут возвращены как часть запроса в индексе: включение таких полей в индекс позволяет индексу охватить запрос и избежать необходимости извлекать документ из основного хранилища.
Для запросов, включающих фильтрацию и сортировку полей массива, рассмотрите возможность создания многоключевых индексов.
Использовать подсказку запроса
Если вы создали более подходящий индекс для запроса, но механизм запросов не использует этот индекс, вы можете переопределить предпочтения механизма запросов по индексу с помощью подсказки запроса.
Дополнительную информацию о результатах запроса, выполненного с помощью Query Explain, см. в разделе Справочник по выполнению запросов .