Aufgeteilte Felder

Auf dieser Seite wird beschrieben, wie Sie die Verwendung von aufgeteilten Feldern in Firestore mit MongoDB-Kompatibilität 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 vollständigen Dokuments gelesen werden.

Abfragen, die von aufgeteilten Feldern profitieren

Lesevorgänge für aufgeteilte Felder werden auf die folgenden Abfrageformen angewendet, sofern verfügbar:

  • Aggregationsabfragen: Abfragen, bei denen nur auf eine Teilmenge von Feldern für Aggregationsvorgänge zugegriffen werden muss. Beispiel:

    db.customers.aggregate(
      [
        { $match: { "account_balance" : { $lt : 0 } } },
        { $count: "total" }
      ]
    );
    

    oder mit group-by:

    db.customers.aggregate([
      { $match: { "account_balance" : { $lt : 0 } } },
      {
        $group: {
          _id: "$market_segment",
          avg_balance: { $avg: "$account_balance" }
        }
      }
    ]);
    
  • Projektionsabfragen: Abfragen, die nur eine bestimmte Teilmenge von Feldern zurückgeben. Beispiel:

    db.customers.find({}, { family_name: 1, given_name: 1, _id: 0 });
    
  • Filterabfragen: Filterabfragen, bei denen die Firestore-Abfrage Engine feststellt, dass die Verwendung von aufgeteilten Feldern für die Dokumentfilterung von Vorteil ist. Beispiel:

    db.customers.find({ 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 Eigenschaftsnamen, die als aufgeteilte Felder gelesen werden.
  • Anzahl der erneuten Prüfungen: Eine Map 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. Dies kann passieren, wenn der Feldwert in einem Dokument 8 KiB übersteigt. Das ist zu groß für den Speicher für aufgeteilte Felder.

Beispielausgabe

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

Verwendung von aufgeteilten Feldern steuern

Standardmäßig verwendet Firestore mit MongoDB-Kompatibilität aufgeteilte Felder, wenn sie verfügbar sind. Sie können dieses Verhalten mit der Option tableScanMethod in Abfragekommentaren steuern.

Unterstützte Werte für tableScanMethod:

  • shreddedFieldsEnabled (Standard): Verwenden Sie aufgeteilte Felder, wenn sie verfügbar sind.
  • shreddedFieldsDisabled: Aufgeteilte Felder werden nicht verwendet.
  • forceShreddedFields: Die Abfrage schlägt fehl, wenn ein Tabellenscan nicht durch Scannen aufgeteilter Felder ausgeführt werden kann.

Befehle suchen

Verwenden Sie die Methode .comment(), um Optionen für einen find-Befehl anzugeben:

db.customers.find(
  { account_balance: 0.0 }
).comment(
  {
    firestoreOptions: {
      tableScanMethod: "shreddedFieldsDisabled"
    }
  }
);

Aggregationsbefehle

Verwenden Sie die Option comment im Optionsparameter eines aggregate-Befehls:

db.customers.aggregate(
  [
    { $match: { "account_balance" : { $lt : 0 } } },
    { $count: "total" }
  ],
  {
    comment: {
      firestoreOptions: {
        tableScanMethod: "shreddedFieldsDisabled"
      }
    }
  }
);

Warnungen zur Abfrageleistung

Firestore mit MongoDB-Kompatibilität kann im Ergebnis von „Abfrage erläutern“ Leistungswarnungen ausgeben, wenn eine ineffiziente Verwendung von aufgeteilten Feldern erkannt wird. Beispiel:

  • Abfragen mit geringer Selektivität: Wenn eine Abfrage aufgeteilte Felder zum Filtern scannt aber nur wenige Dokumente herausfiltert, ist der Scan ineffizient.

  • Abfragen mit vielen erneuten Prüfungen: Wenn die Abfrage häufig auf das Lesen des vollständigen Dokuments zurückgreift, kann sich dies auf die Leistung auswirken. Mit Operatoren wie $bsonSize können Sie große Werte identifizieren, die erneute Prüfungen auslösen.

In diesen Fällen sollten Sie das Lesen von aufgeteilten Feldern mit Abfrageoptionen deaktivieren.

Beschränkungen

Firestore versucht nur, Felder der obersten Ebene aufzuteilen. Außerdem ist die Anzahl der Felder begrenzt, die pro Sammlung aufgeteilt werden können.