Campi frammentati

Questa pagina descrive come visualizzare e controllare l'utilizzo dei campi suddivisi in Cloud Firestore. Questa funzionalità è disponibile nella versione Enterprise di Firestore.

Quando i documenti vengono scritti, Cloud Firestore potrebbe determinare che campi specifici devono essere archiviati in un formato suddiviso. I campi suddivisi 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 suddivisi vengono applicate alle seguenti forme di query, se applicabili:

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

    db.pipeline()
      .collection("/customers")
      .where(lessThan("account_balance", 0))
      .aggregate(
        countAll().as("total"),
      )
    

    o con group-by:

    db.pipeline()
      .collection("/customers")
      .where(lessThan("account_balance", 0))
      .aggregate({
        accumulators: [
          field('account_balance').average().as('avg_account_balance')
        ],
        groups: [field('market_segment')]
      })
    
  • Query di proiezione: query che restituiscono solo un sottoinsieme specifico di campi. Ad esempio:

    db.pipeline()
      .collection("/customers")
      .select("family_name", "given_name")
      .limit(10)
    
  • Query di filtro: query in cui il Cloud Firestore motore di query determina che l'utilizzo di campi suddivisi per il filtraggio dei documenti è vantaggioso. Ad esempio:

    db.pipeline()
      .collection("/customers")
      .where(equal("given_name", "alice"))
    

Visualizzare l'utilizzo dei campi suddivisi

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

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

Output di esempio

...
└── • 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]

Controllare l'utilizzo dei campi suddivisi

Per impostazione predefinita, Cloud Firestore utilizza i campi suddivisi quando sono disponibili. Puoi controllare questo comportamento utilizzando l'opzione di query table_scan_method.

Valori supportati per l'opzione table_scan_method:

  • shredded_fields_enabled (impostazione predefinita): utilizza i campi suddivisi quando sono disponibili.
  • shredded_fields_disabled: non utilizzare i campi suddivisi.
  • force_shredded_fields: la query non riesce se una scansione della tabella non può essere completata eseguendo la scansione dei campi suddivisi.

Esempio

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();

Avvisi sulle prestazioni delle query

Cloud Firestore potrebbe generare avvisi sulle prestazioni nel risultato della spiegazione della query quando viene rilevato un utilizzo inefficiente dei campi suddivisi. Ad esempio:

  • Query a bassa selettività: si verifica quando una query esegue la scansione dei campi suddivisi per il filtraggio, ma filtra un numero troppo basso di documenti, rendendo la scansione inefficiente.

  • Query con un numero elevato di ricontrolli: si verifica quando la query torna spesso alle letture complete dei documenti, il che può influire sulle prestazioni. Puoi utilizzare funzioni come storage_size per identificare valori di grandi dimensioni che attivano i ricontrolli.

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

Limitazioni

Cloud Firestore suddivide solo i campi di primo livello. Limita anche il numero di campi che possono essere suddivisi per gruppo di raccolte.