Kueri yang dioptimalkan dengan kolom yang dipreteli
Halaman ini menjelaskan cara melihat dan mengontrol penggunaan kolom yang diacak di Firestore. Fitur ini tersedia di edisi Firestore Enterprise.
Saat dokumen ditulis, Firestore dapat menentukan bahwa kolom tertentu harus disimpan dalam format yang diacak. Kolom yang di-shred 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 ke bentuk kueri berikut jika berlaku:
Kueri agregasi: Kueri yang hanya perlu mengakses subset kolom untuk operasi agregasi. Contoh:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )atau dengan pengelompokan menurut:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate({ accumulators: [ field('account_balance').average().as('avg_account_balance') ], groups: [field('market_segment')] })Kueri proyeksi: Kueri yang hanya menampilkan subset kolom tertentu. Contoh:
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)Kueri filter: Kueri tempat mesin kueri Firestore menentukan bahwa penggunaan kolom yang di-shred untuk pemfilteran dokumen bermanfaat. Contoh:
db.pipeline() .collection("/customers") .where(equal("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 kolom 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: ($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]
Mengontrol penggunaan kolom yang diacak
Secara default, Firestore menggunakan kolom yang di-shred jika tersedia. Anda dapat
mengontrol perilaku ini menggunakan opsi kueri table_scan_method.
Nilai yang didukung untuk opsi table_scan_method:
shredded_fields_enabled(Default): Gunakan kolom yang diacak jika tersedia.shredded_fields_disabled: Jangan gunakan kolom yang diacak.force_shredded_fields: Gagal menjalankan kueri jika pemindaian tabel tidak dapat dilakukan dengan memindai kolom yang diacak.
Contoh
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();
Peringatan performa kueri
Firestore dapat mengeluarkan peringatan performa dalam hasil penjelasan kueri saat penggunaan kolom yang tidak efisien terdeteksi. Contoh:
Kueri selektivitas rendah: Terjadi saat kueri memindai kolom yang di-shred untuk pemfilteran, tetapi memfilter terlalu sedikit dokumen, sehingga pemindaian menjadi tidak efisien.
Kueri pengecekan ulang tinggi: Terjadi saat kueri sering melakukan penggantian ke pembacaan dokumen lengkap, yang dapat memengaruhi performa. Anda dapat menggunakan fungsi seperti
storage_sizeuntuk mengidentifikasi nilai besar yang memicu pemeriksaan ulang.
Dalam kasus ini, pertimbangkan untuk menonaktifkan pembacaan kolom yang diacak menggunakan opsi kueri.
Batasan
Firestore hanya menghancurkan kolom tingkat teratas. Hal ini juga membatasi jumlah kolom yang dapat dihancurkan per grup koleksi.