หน้านี้อธิบายวิธีดูและควบคุมการใช้งานฟิลด์ที่แยกส่วนใน Cloud Firestore ฟีเจอร์นี้พร้อมใช้งานใน Firestore รุ่น Enterprise
เมื่อเขียนเอกสาร Cloud Firestore อาจกำหนดว่าควรจัดเก็บฟิลด์ที่เฉพาะเจาะจงในรูปแบบที่แยกส่วน ฟิลด์ที่แยกส่วนจะเพิ่มประสิทธิภาพการค้นหาด้วยการอ่านเฉพาะฟิลด์ที่จำเป็นแทนที่จะอ่านทั้งเอกสาร
การค้นหาที่ได้รับประโยชน์จากฟิลด์ที่แยกย่อย
การอ่านในฟิลด์ที่แยกส่วนจะใช้กับรูปร่างการค้นหาต่อไปนี้ในกรณีที่ เกี่ยวข้อง
คำค้นหาการรวบรวม: คำค้นหาที่ต้องเข้าถึงเฉพาะชุดย่อยของฟิลด์ สำหรับการดำเนินการรวบรวม เช่น
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate( countAll().as("total"), )หรือใช้ group-by:
db.pipeline() .collection("/customers") .where(lessThan("account_balance", 0)) .aggregate({ accumulators: [ field('account_balance').average().as('avg_account_balance') ], groups: [field('market_segment')] })การค้นหาการฉายภาพ: การค้นหาที่แสดงเฉพาะฟิลด์ ชุดย่อยที่เฉพาะเจาะจง เช่น
db.pipeline() .collection("/customers") .select("family_name", "given_name") .limit(10)คำค้นหาที่กรอง: คำค้นหาที่Cloud Firestoreเครื่องมือค้นหา พิจารณาว่าการใช้ฟิลด์ที่แยกส่วนเพื่อกรองเอกสารนั้นเป็นประโยชน์ เช่น
db.pipeline() .collection("/customers") .where(equal("given_name", "alice"))
ดูการใช้งานฟิลด์ที่แยกส่วน
คุณสามารถใช้คำอธิบายการค้นหาเพื่อตรวจสอบว่าการค้นหานั้นใช้ฟิลด์ที่แยกส่วนหรือไม่ โหนด
TableScan ในแผนการค้นหามีส่วน Storage ที่มีเมตริกต่อไปนี้
- สแกนรูปร่าง
shredded_fields_only: คำค้นหาจะอ่านจากฟิลด์ที่แยกส่วนเท่านั้นshredded_fields_backjoin: การค้นหาจะอ่านจากฟิลด์ที่แยกย่อยและ รวมกับเอกสารต้นฉบับสำหรับฟิลด์อื่นๆ
- ฟิลด์ที่แยกส่วนที่ใช้: รายชื่อชื่อฟิลด์ที่อ่านเป็นฟิลด์ที่แยกส่วน
- จำนวนการตรวจซ้ำ: แผนที่ของเคาน์เตอร์สำหรับการตรวจซ้ำ การตรวจสอบอีกครั้งหมายถึงการกลับไปอ่านจากเอกสารฉบับเต็มต้นฉบับเมื่อสแกนฟิลด์ที่ถูกทำลาย ปัญหานี้อาจเกิดขึ้นหากค่าฟิลด์ในเอกสารมีขนาดเกิน 8 KiB ซึ่งใหญ่เกินไปสำหรับที่เก็บข้อมูลฟิลด์ที่แยกส่วน
ตัวอย่างเอาต์พุต
...
└── • 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]
ควบคุมการใช้งานฟิลด์ที่แยกส่วน
โดยค่าเริ่มต้น Cloud Firestore จะใช้ฟิลด์ที่แยกส่วนเมื่อมี คุณควบคุมลักษณะการทำงานนี้ได้โดยใช้table_scan_methodตัวเลือกการค้นหา
ค่าที่รองรับสำหรับตัวเลือก table_scan_method มีดังนี้
shredded_fields_enabled(ค่าเริ่มต้น): ใช้ฟิลด์ที่แยกส่วนเมื่อมีshredded_fields_disabled: อย่าใช้ฟิลด์ที่แยกส่วนforce_shredded_fields: ทำให้คำค้นหาไม่สำเร็จหากสแกนตารางไม่ได้ โดยการสแกนฟิลด์ที่แยก
ตัวอย่าง
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();
คำเตือนเกี่ยวกับประสิทธิภาพการค้นหา
Cloud Firestore อาจแสดงคำเตือนด้านประสิทธิภาพในผลลัพธ์ของคำอธิบายการค้นหาเมื่อตรวจพบการใช้ฟิลด์ที่แยกส่วนอย่างไม่มีประสิทธิภาพ เช่น
คำค้นหาที่มีการเลือกต่ำ: เกิดขึ้นเมื่อคำค้นหาสแกนฟิลด์ที่แยกส่วนเพื่อ กรอง แต่กรองเอกสารออกน้อยเกินไป ทำให้การสแกนไม่มีประสิทธิภาพ
คำค้นหาที่มีการตรวจสอบซ้ำสูง: เกิดขึ้นเมื่อคำค้นหาเปลี่ยนกลับไปเป็นการอ่านเอกสารแบบเต็มบ่อยครั้ง ซึ่งอาจส่งผลต่อประสิทธิภาพ คุณสามารถใช้ฟังก์ชันต่างๆ เช่น
storage_sizeเพื่อระบุค่าขนาดใหญ่ที่ทริกเกอร์การตรวจสอบซ้ำ
ในกรณีเหล่านี้ ให้พิจารณาปิดใช้การอ่านฟิลด์ที่แยกส่วนโดยใช้ตัวเลือกการค้นหา
ข้อจำกัด
Cloud Firestore จะลบเฉพาะฟิลด์ระดับบนสุด นอกจากนี้ ยังจำกัด จำนวนฟิลด์ที่สามารถแยกย่อยต่อกลุ่มคอลเล็กชันได้ด้วย