Mit aufgeteilten Feldern optimierte Abfragen
Auf dieser Seite wird beschrieben, wie Sie die Verwendung von aufgeteilten Feldern in Firestore ansehen und steuern. Diese Funktion ist in der Firestore Enterprise-Version verfügbar.
Wenn Dokumente geschrieben werden, kann Firestore feststellen, dass bestimmte Felder in einem aufgeteilten Format gespeichert werden sollten. Aufgeteilte Felder optimieren die Abfrageleistung, indem nur die erforderlichen Felder anstelle des gesamten Dokuments gelesen werden.
Abfragen, die von aufgeteilten Feldern profitieren
Lesevorgänge für aufgeteilte Felder werden gegebenenfalls auf die folgenden Abfrageformen angewendet:
Aggregationsabfragen: Abfragen, für die nur auf eine Teilmenge von Feldern für Aggregationsvorgänge zugegriffen werden muss. Beispiel:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )oder mit 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')] })Projektionsabfragen: Abfragen, die nur eine bestimmte Teilmenge von Feldern zurückgeben. Beispiel:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)Filterabfragen: Abfragen, bei denen die Firestore-Abfrage-Engine feststellt, dass die Verwendung von aufgeteilten Feldern für die Dokumentfilterung von Vorteil ist. Beispiel:
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
Verwendung von aufgeteilten Feldern ansehen
Mit „Abfrage erläutern“ können Sie prüfen, ob eine Abfrage aufgeteilte Felder verwendet. Der Knoten TableScan im Abfrageplan enthält einen Abschnitt Storage mit den folgenden Messwerten:
- Scanform:
shredded_fields_only: Die Abfrage liest nur aus aufgeteilten Feldern.shredded_fields_backjoin: Die Abfrage liest aus aufgeteilten Feldern und führt für andere Felder einen Join mit dem Originaldokument aus.
- Verwendete aufgeteilte Felder: Eine Liste der Feldnamen, die als aufgeteilte Felder gelesen wurden.
- Anzahl der erneuten Prüfungen: Eine Karte mit Zählern für erneute Prüfungen. Eine erneute Prüfung bedeutet, dass beim Scannen der aufgeteilten Felder auf das Lesen aus dem ursprünglichen vollständigen Dokument zurückgegriffen wird. Das kann passieren, wenn der Feldwert in einem Dokument 8 KiB überschreitet, was für den Speicher für aufgeteilte Felder zu groß ist.
Beispielausgabe
...
└── • 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]
Verwendung von aufgeteilten Feldern steuern
Standardmäßig verwendet Firestore aufgeteilte Felder, wenn sie verfügbar sind. Sie können dieses Verhalten mit der Abfrageoption table_scan_method steuern.
Unterstützte Werte für die Option table_scan_method:
shredded_fields_enabled(Standard): Aufgeteilte Felder verwenden, wenn verfügbar.shredded_fields_disabled: Aufgeteilte Felder nicht verwenden.force_shredded_fields: Die Abfrage schlägt fehl, wenn ein Tabellenscan nicht durch Scannen von aufgeteilten Feldern ausgeführt werden kann.
Beispiel
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();
Leistungswarnungen für Abfragen
Firestore kann im Ergebnis von „Abfrage erläutern“ Leistungswarnungen ausgeben, wenn eine ineffiziente Verwendung von aufgeteilten Feldern erkannt wird. Beispiel:
Abfragen mit geringer Selektivität: Tritt auf, wenn eine Abfrage aufgeteilte Felder zum Filtern scannt, aber zu wenige Dokumente herausfiltert, wodurch der Scan ineffizient wird.
Abfragen mit vielen erneuten Prüfungen: Tritt auf, wenn die Abfrage häufig auf das Lesen des vollständigen Dokuments zurückgreift, was sich auf die Leistung auswirken kann. Mit Funktionen wie
storage_sizekönnen Sie große Werte ermitteln, die erneute Prüfungen auslösen.
In diesen Fällen sollten Sie das Lesen von aufgeteilten Feldern mit Abfrageoptionen deaktivieren.
Beschränkungen
Firestore teilt nur Felder der obersten Ebene auf. Außerdem ist die Anzahl der Felder begrenzt, die pro Sammlungs-Gruppe aufgeteilt werden können.