ฟิลด์ที่แยกย่อย

หน้านี้อธิบายวิธีดูและควบคุมการใช้งานฟิลด์ที่แยกส่วนใน 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 จะลบเฉพาะฟิลด์ระดับบนสุด นอกจากนี้ ยังจำกัด จำนวนฟิลด์ที่สามารถแยกย่อยต่อกลุ่มคอลเล็กชันได้ด้วย