シュレッド フィールド

このページでは、MongoDB 互換の Firestore でシュレッド フィールドの使用状況を表示および制御する方法について説明します。これは、Firestore Enterprise エディションで利用できます。

ドキュメントが書き込まれると、Firestore は特定のフィールドをシュレッド形式で保存する必要があると判断する場合があります。シュレッド フィールドは、ドキュメント全体ではなく必要なフィールドのみを読み取ることで、クエリのパフォーマンスを最適化します。

シュレッド フィールドのメリットを享受できるクエリ

シュレッド フィールドの読み取りは、使用可能な場合、次のクエリ形状に適用されます。

  • 集計クエリ: 集計オペレーションでフィールドのサブセットにのみアクセスする必要があるクエリ 。次に例を示します。

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

    または group-by を使用します。

    db.customers.aggregate([
      { $match: { "account_balance" : { $lt : 0 } } },
      {
        $group: {
          _id: "$market_segment",
          avg_balance: { $avg: "$account_balance" }
        }
      }
    ]);
    
  • 射影クエリ: フィールドの特定のサブセットのみを返すクエリ。次に例を示します。

    db.customers.find({}, { family_name: 1, given_name: 1, _id: 0 });
    
  • フィルタ クエリ: Firestore クエリ エンジンが、ドキュメント フィルタリングにシュレッド フィールドを使用することが 有益であると判断するフィルタ クエリ。次に例を示します。

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

シュレッド フィールドの使用状況を表示する

クエリでシュレッド フィールドが使用されているかどうかを確認するには、クエリの説明を使用します。クエリプランの TableScan ノードには、次の指標を含む Storage セクションが含まれています。

  • スキャン形状:
    • shredded_fields_only: クエリはシュレッド フィールドからのみ読み取ります。
    • shredded_fields_backjoin: クエリはシュレッド フィールドから読み取り、他のフィールドの元のドキュメントと結合します。
  • 使用されているシュレッド フィールド: シュレッド フィールドとして読み取られるプロパティ名のリスト。
  • 再確認数: 再確認のカウンタのマップ。再確認とは、シュレッド フィールドをスキャンするときに、元の完全なドキュメントからの読み取りに戻ることを意味します。これは、ドキュメント内のフィールド値が 8 KiB を超える場合に発生する可能性があります。これは、シュレッド フィールド ストレージには大きすぎます。

出力例

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

シュレッド フィールドの使用状況を制御する

デフォルトでは、MongoDB 互換の Firestore は、使用可能な場合にシュレッド フィールドを使用します。この動作は、クエリ コメントの tableScanMethod オプションを使用して制御できます。

tableScanMethod でサポートされている値は次のとおりです。

  • shreddedFieldsEnabled(デフォルト): 使用可能な場合はシュレッド フィールドを使用します。
  • shreddedFieldsDisabled: シュレッド フィールドは使用されません。
  • forceShreddedFields: シュレッド フィールドのスキャンでテーブル スキャンを実行できない場合は、クエリを失敗させます。

コマンドを検索する

.comment() メソッドを使用して、find コマンドのオプションを指定します。

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

集計コマンド

aggregate コマンドの options パラメータで comment オプションを使用します。

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

クエリのパフォーマンスに関する警告

MongoDB 互換の Firestore は、シュレッド フィールドの非効率的な使用が検出されると、クエリの説明の結果にパフォーマンスに関する警告を表示することがあります。次に例を示します。

  • 選択性の低いクエリ: クエリがフィルタリングのためにシュレッド フィールドをスキャンするが フィルタで除外されるドキュメントが少なく、スキャンが非効率になる場合。

  • 再確認の多いクエリ: クエリが完全なドキュメントの読み取りに 頻繁に戻る場合。パフォーマンスに影響する可能性があります。$bsonSize などの演算子を使用して、再確認をトリガーする大きな値を特定できます。

このような場合は、クエリ オプションを使用してシュレッド フィールドの読み取りを無効にすることを検討してください。

制限事項

Firestore は、最上位フィールドのシュレッド化のみを試みます。また、コレクションごとにシュレッドできるフィールドの数も制限されます。