Campos fragmentados
Nesta página, descrevemos como visualizar e controlar o uso de campos fragmentados no Firestore com compatibilidade com o MongoDB. Esse recurso está disponível na edição Enterprise do Firestore.
Quando os documentos são gravados, o Firestore pode determinar que campos específicos sejam armazenados em um formato fragmentado. Os campos fragmentados otimizam o desempenho da consulta lendo apenas os campos necessários em vez do documento completo.
Consultas que se beneficiam de campos fragmentados
As leituras em campos fragmentados são aplicadas às seguintes formas de consulta quando disponíveis:
Consultas de agregação: consultas que só precisam acessar um subconjunto de campos para operações de agregação. Exemplo:
db.customers.aggregate( [ { $match: { "account_balance" : { $lt : 0 } } }, { $count: "total" } ] );ou com group-by:
db.customers.aggregate([ { $match: { "account_balance" : { $lt : 0 } } }, { $group: { _id: "$market_segment", avg_balance: { $avg: "$account_balance" } } } ]);Consultas de projeção: consultas que retornam apenas um subconjunto específico de campos. Exemplo:
db.customers.find({}, { family_name: 1, given_name: 1, _id: 0 });Consultas de filtro: consultas de filtro em que o mecanismo de consulta do Firestore determina que o uso de campos fragmentados para filtragem de documentos é benéfico. Exemplo:
db.customers.find({ given_name: "Alice" });
Visualizar o uso de campos fragmentados
É possível usar o Query Explain para verificar se uma consulta usa campos fragmentados. O nó TableScan no plano de consulta inclui uma seção Storage com as seguintes métricas:
- Forma de verificação:
shredded_fields_only: a consulta lê apenas campos fragmentados.shredded_fields_backjoin: a consulta lê campos fragmentados e une o documento original para outros campos.
- Campos fragmentados usados: uma lista de nomes de propriedades lidas como campos fragmentados.
- Contagem de novas verificações: um mapa de contadores para novas verificações. Uma nova verificação significa voltar a ler o documento completo original ao verificar os campos fragmentados. Isso pode acontecer se o valor do campo em um documento exceder 8 KiB, que é muito grande para o armazenamento de campos fragmentados.
Exemplo de saída
...
└── • 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]
Controlar o uso de campos fragmentados
Por padrão, o Firestore com compatibilidade com o MongoDB usa campos fragmentados quando disponíveis. É possível controlar esse comportamento usando a opção tableScanMethod nos comentários da consulta.
Valores aceitos para tableScanMethod:
shreddedFieldsEnabled(padrão): usa campos fragmentados quando disponíveis.shreddedFieldsDisabled: os campos fragmentados não serão usados.forceShreddedFields: falha na consulta se uma verificação de tabela não puder ser concluída verificando campos fragmentados.
Encontrar comandos
Use o método .comment() para especificar opções de um comando find:
db.customers.find(
{ account_balance: 0.0 }
).comment(
{
firestoreOptions: {
tableScanMethod: "shreddedFieldsDisabled"
}
}
);
Comandos agregados
Use a opção comment no parâmetro de opções de um comando aggregate:
db.customers.aggregate(
[
{ $match: { "account_balance" : { $lt : 0 } } },
{ $count: "total" }
],
{
comment: {
firestoreOptions: {
tableScanMethod: "shreddedFieldsDisabled"
}
}
}
);
Avisos de desempenho da consulta
O Firestore com compatibilidade com o MongoDB pode emitir avisos de desempenho no resultado do Query Explain quando um uso ineficiente de campos fragmentados é detectado. Exemplo:
Consultas de baixa seletividade: se uma consulta verificar campos fragmentados para filtragem mas filtrar poucos documentos, tornando a verificação ineficiente.
Consultas de alta verificação: se a consulta voltar a leituras de documentos completos com frequência, o que pode afetar o desempenho. É possível usar operadores como
$bsonSizepara identificar valores grandes que acionam novas verificações.
Nesses casos, considere desativar as leituras de campos fragmentados usando as opções de consulta.
Limitações
O Firestore só tenta fragmentar campos de nível superior. Ele também restringe o número de campos que podem ser fragmentados por coleção.