Champs fragmentés

Cette page explique comment afficher et contrôler l'utilisation des champs fragmentés dans Firestore compatible avec MongoDB. Cette fonctionnalité est disponible dans l'édition Firestore Enterprise.

Lors de l'écriture de documents, Firestore peut déterminer que des champs spécifiques doivent être stockés dans un format fragmenté. Les champs fragmentés optimisent les performances des requêtes en ne lisant que les champs requis au lieu du document complet.

Requêtes qui bénéficient des champs fragmentés

Les lectures sur les champs fragmentés sont appliquées aux formes de requêtes suivantes lorsqu'elles sont disponibles :

  • Requêtes d'agrégation : requêtes qui n'ont besoin d'accéder qu'à un sous-ensemble de champs pour les opérations d'agrégation. Exemple :

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

    ou avec group-by :

    db.customers.aggregate([
      { $match: { "account_balance" : { $lt : 0 } } },
      {
        $group: {
          _id: "$market_segment",
          avg_balance: { $avg: "$account_balance" }
        }
      }
    ]);
    
  • Requêtes de projection : requêtes qui ne renvoient qu'un sous-ensemble spécifique de champs. Exemple :

    db.customers.find({}, { family_name: 1, given_name: 1, _id: 0 });
    
  • Requêtes de filtre : requêtes de filtre dans lesquelles le moteur de requêtes Firestore détermine qu'il est avantageux d'utiliser des champs fragmentés pour le filtrage des documents. Exemple :

    db.customers.find({ given_name: "Alice" });
    

Afficher l'utilisation des champs fragmentés

Vous pouvez utiliser l'explication de la requête pour vérifier si une requête utilise des champs fragmentés. Le nœud TableScan du plan de requête inclut une section Storage avec les métriques suivantes :

  • Forme de l'analyse:
    • shredded_fields_only : la requête ne lit que les champs fragmentés.
    • shredded_fields_backjoin: la requête lit les champs fragmentés et les joint au document d'origine pour les autres champs.
  • Champs fragmentés utilisés : liste des noms de propriétés lues en tant que champs fragmentés.
  • Nombre de revérifications : carte des compteurs pour les revérifications. Une revérification signifie revenir à la lecture du document complet d'origine lors de l'analyse des champs fragmentés. Cela peut se produire si la valeur du champ dans un document dépasse 8 Kio, ce qui est trop volumineux pour le stockage des champs fragmentés.

Exemple de résultat :

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

Contrôler l'utilisation des champs fragmentés

Par défaut, Firestore compatible avec MongoDB utilise des champs fragmentés lorsqu'ils sont disponibles. Vous pouvez contrôler ce comportement à l'aide de l'option tableScanMethod dans les commentaires de la requête.

Valeurs compatibles pour tableScanMethod :

  • shreddedFieldsEnabled (par défaut) : utiliser des champs fragmentés lorsqu'ils sont disponibles.
  • shreddedFieldsDisabled : les champs fragmentés ne seront pas utilisés.
  • forceShreddedFields: la requête échoue si une analyse de table ne peut pas être effectuée en analysant les champs fragmentés.

Rechercher des commandes

Utilisez la méthode .comment() pour spécifier des options pour une commande find :

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

Commandes d'agrégation

Utilisez l'option comment dans le paramètre d'options d'une commande aggregate :

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

Avertissements concernant les performances des requêtes

Firestore compatible avec MongoDB peut émettre des avertissements concernant les performances dans le résultat de l'explication de la requête lorsqu'une utilisation inefficace des champs fragmentés est détectée. Exemple :

  • Requêtes à faible sélectivité : si une requête analyse des champs fragmentés pour le filtrage mais filtre peu de documents, ce qui rend l'analyse inefficace.

  • Requêtes à revérification élevée : si la requête revient fréquemment à des lectures de documents complets, ce qui peut avoir un impact sur les performances. Vous pouvez utiliser des opérateurs tels que $bsonSize pour identifier les valeurs volumineuses qui déclenchent des revérifications.

Dans ce cas, envisagez de désactiver les lectures de champs fragmentés à l'aide des options de requête.

Limites

Firestore tente uniquement de fragmenter les champs de premier niveau. Il limite également le nombre de champs qui peuvent être fragmentés par collection.