Kolom yang Dihancurkan

Halaman ini menjelaskan cara melihat dan mengontrol penggunaan kolom yang di-shred di Firestore dengan kompatibilitas MongoDB. Fitur ini tersedia di edisi Firestore Enterprise.

Saat dokumen ditulis, Firestore dapat menentukan bahwa kolom tertentu harus disimpan dalam format yang diacak. Kolom yang diacak mengoptimalkan performa kueri dengan hanya membaca kolom yang diperlukan, bukan seluruh dokumen.

Kueri yang mendapatkan manfaat dari kolom yang dipecah

Pembacaan pada kolom yang diacak diterapkan pada bentuk kueri berikut jika tersedia:

  • Kueri agregasi: Kueri yang hanya perlu mengakses subset kolom untuk operasi agregasi. Contoh:

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

    atau dengan pengelompokan menurut:

    db.customers.aggregate([
      { $match: { "account_balance" : { $lt : 0 } } },
      {
        $group: {
          _id: "$market_segment",
          avg_balance: { $avg: "$account_balance" }
        }
      }
    ]);
    
  • Kueri proyeksi: Kueri yang hanya menampilkan subset kolom tertentu. Contoh:

    db.customers.find({}, { family_name: 1, given_name: 1, _id: 0 });
    
  • Kueri filter: Memfilter kueri tempat Firestore Query Engine menentukan bahwa penggunaan kolom yang di-shred untuk pemfilteran dokumen bermanfaat. Contoh:

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

Melihat penggunaan kolom yang diacak

Anda dapat menggunakan penjelasan kueri untuk memeriksa apakah kueri menggunakan kolom yang di-shred. Node TableScan dalam rencana kueri mencakup bagian Storage dengan metrik berikut:

  • Bentuk pemindaian:
    • shredded_fields_only: Kueri hanya membaca dari kolom yang diacak.
    • shredded_fields_backjoin: Kueri membaca dari kolom yang diacak dan bergabung dengan dokumen asli untuk kolom lainnya.
  • Kolom yang diacak yang digunakan: Daftar nama properti yang dibaca sebagai kolom yang diacak.
  • Jumlah pemeriksaan ulang: Peta penghitung untuk pemeriksaan ulang. Pemeriksaan ulang berarti kembali membaca dari dokumen lengkap asli saat memindai kolom yang dipecah-pecah. Hal ini dapat terjadi jika nilai kolom dalam dokumen melebihi 8 KiB, yang terlalu besar untuk penyimpanan kolom yang di-shred.

Contoh output

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

Mengontrol penggunaan kolom yang diacak

Secara default, Firestore dengan kompatibilitas MongoDB menggunakan kolom yang diacak jika tersedia. Anda dapat mengontrol perilaku ini menggunakan opsi tableScanMethod dalam komentar kueri.

Nilai yang didukung untuk tableScanMethod:

  • shreddedFieldsEnabled (Default): Gunakan kolom yang diacak jika tersedia.
  • shreddedFieldsDisabled: Kolom yang diacak tidak akan digunakan.
  • forceShreddedFields: Gagal menjalankan kueri jika pemindaian tabel tidak dapat dilakukan dengan memindai kolom yang diacak.

Menemukan perintah

Gunakan metode .comment() untuk menentukan opsi untuk perintah find:

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

Perintah gabungan

Gunakan opsi comment di parameter opsi perintah aggregate:

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

Peringatan performa kueri

Firestore dengan kompatibilitas MongoDB dapat memunculkan peringatan performa dalam hasil penjelasan kueri saat penggunaan kolom yang tidak efisien terdeteksi. Contoh:

  • Kueri selektivitas rendah: Jika kueri memindai kolom yang di-shred untuk pemfilteran, tetapi memfilter sedikit dokumen, sehingga pemindaian menjadi tidak efisien.

  • Kueri pemeriksaan ulang tinggi: Jika kueri sering melakukan penggantian ke pembacaan dokumen lengkap, yang dapat memengaruhi performa. Anda dapat menggunakan operator seperti $bsonSize untuk mengidentifikasi nilai besar yang memicu pemeriksaan ulang.

Dalam kasus ini, pertimbangkan untuk menonaktifkan pembacaan kolom yang diacak menggunakan opsi kueri.

Batasan

Firestore hanya mencoba menghancurkan kolom tingkat teratas. Selain itu, fitur ini membatasi jumlah kolom yang dapat dihancurkan per koleksi.