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
$bsonSizeper 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.