Измельчённые поля

На этой странице описано, как просматривать и контролировать использование удаленных полей в 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 уничтожает только поля верхнего уровня. Кроме того, он ограничивает количество полей, которые могут быть уничтожены в рамках одной группы коллекций.