Consultas optimizadas con campos fragmentados
En esta página, se describe cómo ver y controlar el uso de campos fragmentados en Firestore. Esta función está disponible en la edición Enterprise de Firestore.
Cuando se escriben documentos, Firestore puede determinar que los campos específicos se deben almacenar en un formato fragmentado. Los campos fragmentados optimizan el rendimiento de las consultas, ya que leen solo los campos requeridos en lugar del documento completo.
Consultas que se benefician de los campos fragmentados
Las lecturas en campos fragmentados se aplican a las siguientes formas de consulta cuando corresponde:
Consultas de agregación: Consultas que solo necesitan acceder a un subconjunto de campos para las operaciones de agregación. Por ejemplo:
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')] })Consultas de proyección: Consultas que solo muestran un subconjunto específico de campos. Por ejemplo:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)Consultas de filtro: Consultas en las que el motor de consultas de Firestore determina que es beneficioso usar campos fragmentados para el filtrado de documentos. Por ejemplo:
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
Consulta el uso de campos fragmentados
Puedes usar Query Explain para verificar si una consulta usa campos fragmentados. El nodo TableScan en el plan de consulta incluye una sección Storage con las siguientes métricas:
- Scan shape:
shredded_fields_only: La consulta lee solo de campos fragmentados.shredded_fields_backjoin: La consulta lee de campos fragmentados y se une con el documento original para otros campos.
- Campos fragmentados utilizados: Una lista de nombres de campos leídos como campos fragmentados.
- Recheck count: Un mapa de contadores para las verificaciones. Una verificación significa volver a leer del documento completo original cuando se analizan los campos fragmentados. Esto puede suceder si el valor del campo en un documento supera los 8 KiB, que es demasiado grande para el almacenamiento de campos fragmentados.
Resultado de ejemplo
...
└── • 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]
Controla el uso de campos fragmentados
De forma predeterminada, Firestore usa campos fragmentados cuando están disponibles. Puedes controlar este comportamiento con la opción de consulta table_scan_method.
Valores admitidos para la opción table_scan_method:
shredded_fields_enabled(predeterminado): Usa campos fragmentados cuando estén disponibles.shredded_fields_disabled: No uses campos fragmentados.force_shredded_fields: Si no se puede realizar un análisis de tabla mediante el análisis de campos fragmentados, la consulta fallará.
Ejemplo
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();
Advertencias sobre el rendimiento de las consultas
Firestore puede emitir advertencias de rendimiento en el resultado de Query Explain cuando se detecta un uso ineficiente de campos fragmentados. Por ejemplo:
Consultas de baja selectividad: Se produce cuando una consulta analiza campos fragmentados para filtrar, pero filtra muy pocos documentos, lo que hace que el análisis sea ineficiente.
Consultas de alta verificación: Se produce cuando la consulta vuelve a leer el documento completo con frecuencia, lo que puede afectar el rendimiento. Puedes usar funciones como
storage_sizepara identificar valores grandes que activan las verificaciones.
En estos casos, considera inhabilitar las lecturas de campos fragmentados con opciones de consulta.
Limitaciones
Firestore solo fragmenta los campos de nivel superior. También restringe la cantidad de campos que se pueden fragmentar por grupo de colección.