На этой странице описано, как просматривать и контролировать использование удаленных полей в Cloud Firestore . Эта функция доступна в версии Firestore Enterprise.
При записи документов Cloud Firestore может определить, что определенные поля должны храниться в усеченном формате. Усеченные поля оптимизируют производительность запросов, считывая только необходимые поля, а не весь документ целиком.
Запросы, которые выигрывают от использования измельченных полей
При чтении из измельченных полей применяются следующие типы запросов, где это применимо:
Агрегационные запросы : запросы, которым для выполнения агрегационных операций требуется доступ только к подмножеству полей. Например:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )или с использованием группировки:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate({ accumulators: [ field('account_balance').average().as('avg_account_balance') ], groups: [field('market_segment')] })Запросы с проекцией : запросы, которые возвращают только определенное подмножество полей. Например:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)Фильтрующие запросы : запросы, в которых механизм запросов Cloud Firestore определяет, что использование фрагментированных полей для фильтрации документов является целесообразным. Например:
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
Просмотр использования измельченных полей
С помощью команды `query explain` можно проверить, использует ли запрос разделенные поля. Узел TableScan в плане выполнения запроса включает раздел Storage со следующими метриками:
- Форма сканирования :
-
shredded_fields_only: Запрос считывает данные только из удаленных полей. -
shredded_fields_backjoin: Запрос считывает данные из удаленных полей и объединяет их с исходным документом для определения других полей.
-
- Используемые измельченные поля : список имен полей, считываемых как измельченные поля.
- Счетчик повторных проверок : Карта счетчиков повторных проверок. Повторная проверка означает возврат к чтению исходного полного документа при сканировании измельченных полей. Это может произойти, если значение поля в документе превышает 8 КиБ, что слишком много для хранилища измельченных полей.
Пример выходных данных
...
└── • TableScan
source: /customers
order: UNDEFINED
row range: (-∞..+∞)
filter: ($account_balance_1 < 0L)
output bindings: {$account_balance_1=account_balance, $market_segment_1=market_segment}
variables: [$account_balance_1, $market_segment_1]
Execution:
records returned: 1,374
latency: 26.58 ms
post-filtered rows: 13,626
records scanned: 15,000
data bytes read: 23.73 MiB (24,887,141 B)
Storage:
scan shape: shredded_fields_only
shredded fields used: [account_balance, market_segment]
Контроль использования измельченных полей
По умолчанию Cloud Firestore использует измельченные поля, если они доступны. Вы можете управлять этим поведением с помощью параметра запроса table_scan_method .
Поддерживаемые значения для параметра table_scan_method :
-
shredded_fields_enabled(По умолчанию): Использовать измельченные поля, если они доступны. -
shredded_fields_disabled: Не использовать измельченные поля. -
force_shredded_fields: Завершить запрос с ошибкой, если сканирование таблицы не может быть выполнено путем сканирования удаленных полей.
Пример
var opts = new PipelineExecuteOptions()
.with("table_scan_method", "shredded_fields_disabled");
var snapshot = db.pipeline()
.collection("/customers")
.where(equal("given_name", "alice"))
.execute(opts)
.get();
Предупреждения о производительности запросов
В случае обнаружения неэффективного использования измельченных полей Cloud Firestore может выдавать предупреждения о производительности в результатах запроса explain. Например:
Запросы с низкой избирательностью : возникают, когда запрос сканирует фрагментированные поля для фильтрации, но отфильтровывает слишком мало документов, что делает сканирование неэффективным.
Запросы с высокой частотой повторных проверок : возникают, когда запрос часто переключается на чтение всего документа, что может повлиять на производительность. Вы можете использовать такие функции, как
storage_sizeдля определения больших значений, которые вызывают повторные проверки.
В таких случаях рекомендуется отключить чтение удаленных полей с помощью параметров запроса.
Ограничения
Cloud Firestore уничтожает только поля верхнего уровня. Кроме того, он ограничивает количество полей, которые могут быть уничтожены в рамках одной группы коллекций.