Campi frammentati

Questa pagina descrive come visualizzare e controllare l'utilizzo dei campi frammentati in Firestore con compatibilità MongoDB. Questa opzione è disponibile nella versione Enterprise di Firestore.

Quando vengono scritti i documenti, Firestore può determinare che campi specifici devono essere archiviati in un formato frammentato. I campi frammentati ottimizzano le prestazioni delle query leggendo solo i campi richiesti anziché l'intero documento.

Query che traggono vantaggio dai campi suddivisi

Le letture sui campi frammentati vengono applicate alle seguenti forme di query quando disponibili:

  • Query di aggregazione: query che devono accedere solo a un sottoinsieme di campi per le operazioni di aggregazione. Ad esempio:

    db.customers.aggregate(
      [
        { $match: { "account_balance" : { $lt : 0 } } },
        { $count: "total" }
      ]
    );
    

    o con il raggruppamento:

    db.customers.aggregate([
      { $match: { "account_balance" : { $lt : 0 } } },
      {
        $group: {
          _id: "$market_segment",
          avg_balance: { $avg: "$account_balance" }
        }
      }
    ]);
    
  • Query di proiezione: query che restituiscono solo un sottoinsieme specifico di campi. Ad esempio:

    db.customers.find({}, { family_name: 1, given_name: 1, _id: 0 });
    
  • Query di filtro: query di filtro in cui il motore di query Firestore determina che l'utilizzo di campi frammentati per il filtraggio dei documenti è vantaggioso. Ad esempio:

    db.customers.find({ given_name: "Alice" });
    

Visualizzare l'utilizzo dei campi eliminati

Puoi utilizzare Spiega query per verificare se una query utilizza campi frammentati. Il nodo TableScan nel piano di query include una sezione Storage con le seguenti metriche:

  • Forma della scansione:
    • shredded_fields_only: La query legge solo i campi frammentati.
    • shredded_fields_backjoin: La query legge i campi frammentati e si unisce al documento originale per altri campi.
  • Campi frammentati utilizzati: un elenco dei nomi delle proprietà letti come campi frammentati.
  • Conteggio dei ricontrolli: una mappa dei contatori per i ricontrolli. Un controllo significa tornare alla lettura del documento completo originale durante la scansione dei campi frammentati. Ciò può accadere se il valore del campo in un documento supera 8 KiB, che è troppo grande per l'archiviazione dei campi frammentati.

Output di esempio

...
└── • TableScan
        source: **/customers
        order: UNDEFINED
        row range: (-∞..+∞)
        filter: $lt($account_balance_1, 0)
        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]

Controllare l'utilizzo dei campi frammentati

Per impostazione predefinita, Firestore con compatibilità MongoDB utilizza i campi frammentati quando disponibili. Puoi controllare questo comportamento utilizzando l'opzione tableScanMethod nei commenti della query.

Valori supportati per tableScanMethod:

  • shreddedFieldsEnabled (impostazione predefinita): utilizza i campi frammentati, se disponibili.
  • shreddedFieldsDisabled: i campi frammentati non verranno utilizzati.
  • forceShreddedFields: la query non va a buon fine se una scansione della tabella non può essere completata scansionando i campi frammentati.

Trovare i comandi

Utilizza il metodo .comment() per specificare le opzioni per un comando find:

db.customers.find(
  { account_balance: 0.0 }
).comment(
  {
    firestoreOptions: {
      tableScanMethod: "shreddedFieldsDisabled"
    }
  }
);

Comandi di aggregazione

Utilizza l'opzione comment nel parametro options di un comando aggregate:

db.customers.aggregate(
  [
    { $match: { "account_balance" : { $lt : 0 } } },
    { $count: "total" }
  ],
  {
    comment: {
      firestoreOptions: {
        tableScanMethod: "shreddedFieldsDisabled"
      }
    }
  }
);

Avvisi sul rendimento delle query

Firestore con compatibilità MongoDB potrebbe generare avvisi sulle prestazioni nel risultato di spiegazione della query quando viene rilevato un utilizzo inefficiente dei campi frammentati. Ad esempio:

  • Query a bassa selettività: se una query esamina i campi frammentati per il filtraggio, ma filtra pochi documenti, rendendo la scansione inefficiente.

  • Query con molti controlli: se la query esegue spesso il fallback alla lettura completa del documento, il che può influire sulle prestazioni. Puoi utilizzare operatori come $bsonSize per identificare valori elevati che attivano i controlli.

In questi casi, valuta la possibilità di disattivare le letture dei campi frammentati utilizzando le opzioni di query.

Limitazioni

Firestore tenta di eliminare solo i campi di primo livello. Inoltre, limita il numero di campi che possono essere eliminati per raccolta.