ทำความเข้าใจประสิทธิภาพของการค้นหาโดยใช้คำอธิบายการค้นหา

คำอธิบายคำค้นหาช่วยให้คุณส่งคำค้นหา Cloud Firestore รายการไปยัง แบ็กเอนด์และรับสถิติประสิทธิภาพโดยละเอียดเกี่ยวกับการดำเนินการค้นหาแบ็กเอนด์ เป็นการตอบแทน ฟังก์ชันนี้จะเหมือนกับการดำเนินการ EXPLAIN [ANALYZE] ในหลายๆ ระบบฐานข้อมูลเชิงสัมพันธ์

คุณส่งคำขอคำอธิบายการค้นหาได้โดยใช้ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ Firestore

ผลการอธิบายการค้นหาจะช่วยให้คุณเข้าใจวิธีดำเนินการค้นหา โดยจะแสดงจุดที่ไม่มีประสิทธิภาพและตำแหน่งของคอขวดฝั่งเซิร์ฟเวอร์ที่เป็นไปได้

คำอธิบายข้อความค้นหา:

  • ให้ข้อมูลเชิงลึกเกี่ยวกับระยะการวางแผนการค้นหาเพื่อให้คุณปรับดัชนีการค้นหาและเพิ่มประสิทธิภาพได้
  • การใช้ตัวเลือกการวิเคราะห์จะช่วยให้คุณเข้าใจค่าใช้จ่ายและประสิทธิภาพของคุณใน ตามแต่ละคำสืบค้น และช่วยให้คุณทำซ้ำผ่านคำค้นหาต่างๆ ได้อย่างรวดเร็ว เพื่อเพิ่มประสิทธิภาพการใช้งาน

ทําความเข้าใจตัวเลือกคําอธิบายการค้นหา: ค่าเริ่มต้นและวิเคราะห์

การดำเนินการอธิบายการค้นหาสามารถทำได้โดยใช้ตัวเลือกเริ่มต้นหรือ analyze ด้วย

เมื่อใช้ตัวเลือกเริ่มต้น คำอธิบายการค้นหาจะวางแผนการค้นหา แต่ข้ามระยะการดําเนินการ ซึ่งจะแสดงข้อมูลระยะของแผน คุณสามารถใช้ข้อมูลนี้เพื่อตรวจสอบว่าข้อความค้นหามีดัชนีที่จําเป็นและเข้าใจว่าดัชนีใดบ้างที่ใช้ ซึ่งช่วยยืนยันได้ว่า มีการใช้ดัชนีผสมที่ต้องตัดกับ ดัชนี

ด้วยตัวเลือกการวิเคราะห์ Query Explain ทั้งแผนและดำเนินการตาม คำถาม ซึ่งจะแสดงผลข้อมูลเครื่องมือวางแผนที่กล่าวถึงก่อนหน้านี้ทั้งหมด จากรันไทม์ของการดำเนินการค้นหา ซึ่งรวมถึงการเรียกเก็บเงิน พร้อมกับข้อมูลเชิงลึกระดับระบบเกี่ยวกับ Query สูงสุด คุณสามารถใช้เครื่องมือนี้เพื่อทดสอบการค้นหาและดัชนีต่างๆ เพื่อเพิ่มประสิทธิภาพต้นทุนและเวลาในการตอบสนอง

Query Explain มีค่าใช้จ่ายเท่าไร

เมื่อคุณใช้ "คำอธิบายการค้นหา" กับตัวเลือกเริ่มต้น ไม่มีการดำเนินการดัชนีหรือการอ่าน ที่ได้รับ ระบบจะเรียกเก็บเงินการดำเนินการอ่าน 1 ครั้งโดยไม่คำนึงถึงความซับซ้อนของคำค้นหา

เมื่อคุณใช้ "คำอธิบายการค้นหา" กับตัวเลือกการวิเคราะห์ จัดทำดัชนี และอ่านการดำเนินการ คุณจึงจะถูกเรียกเก็บเงินสำหรับคำค้นหาตามปกติ จะไม่มีค่าใช้จ่ายเพิ่มเติมสําหรับกิจกรรมการวิเคราะห์ แต่จะเรียกเก็บตามปกติสําหรับการเรียกใช้การค้นหา

ใช้คําอธิบายการค้นหากับตัวเลือกเริ่มต้น

คุณสามารถใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคำขอตัวเลือกเริ่มต้นได้

โปรดทราบว่าคำขอได้รับการตรวจสอบสิทธิ์ด้วย IAM โดยใช้ สิทธิ์สำหรับการดำเนินการค้นหาปกติ เทคนิคการตรวจสอบสิทธิ์อื่นๆ เช่น Firebase Authentication จะถูกละเว้น สำหรับข้อมูลเพิ่มเติม โปรดดูคู่มือใน IAM สำหรับไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์

Java (ผู้ดูแลระบบ)

Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();

    
โหนด (ผู้ดูแลระบบ)

const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;

    

รูปแบบการตอบสนองที่แน่นอนจะขึ้นอยู่กับสภาพแวดล้อมการดำเนินการ ผลลัพธ์ที่แสดงจะแปลงเป็น JSON ได้ เช่น

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

สำหรับข้อมูลเพิ่มเติม โปรดดูที่ข้อมูลอ้างอิงรายงานที่อธิบายข้อความค้นหา

ใช้ Query Explain กับตัวเลือกการวิเคราะห์

คุณสามารถใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคำขอตัวเลือกการวิเคราะห์ได้

โปรดทราบว่าคำขอได้รับการตรวจสอบสิทธิ์ด้วย IAM โดยใช้ สิทธิ์สำหรับการดำเนินการค้นหาปกติ เทคนิคการตรวจสอบสิทธิ์อื่นๆ เช่น Firebase Authentication จะถูกละเว้น สำหรับข้อมูลเพิ่มเติม โปรดดูคู่มือใน IAM สำหรับไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์

Java (ผู้ดูแลระบบ)

Query q = db.collection("col").whereGreaterThan("a", 1);

ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();

ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();

ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();

    
โหนด (ผู้ดูแลระบบ)

const q = db.collection('col').where('country', '=', 'USA');

const options = { analyze : 'true' };

const explainResults = await q.explain(options);

const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;

    

ตัวอย่างต่อไปนี้แสดงออบเจ็กต์ stats ที่แสดงผลเพิ่มเติมจาก planInfo รูปแบบการตอบสนองที่แน่นอนจะขึ้นอยู่กับสภาพแวดล้อมการดำเนินการ คำตอบตัวอย่างอยู่ในรูปแบบ JSON

{
    "resultsReturned": "5",
    "executionDuration": "0.100718s",
    "readOperations": "5",
    "debugStats": {
               "index_entries_scanned": "95000",
               "documents_scanned": "5"
               "billing_details": {
                     "documents_billable": "5",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }

}

ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิงรายงานคำอธิบายการค้นหา

ตีความผลลัพธ์และทำการปรับเปลี่ยน

มาดูตัวอย่างสถานการณ์ที่เราค้นหาภาพยนตร์ตามประเภทและประเทศที่ผลิตกัน

สำหรับภาพประกอบ ให้สมมติสิ่งที่เทียบเท่ากับการค้นหา SQL นี้

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

ถ้าเราใช้ตัวเลือกการวิเคราะห์ เมตริกที่แสดงผลจะแสดงการค้นหา ทำงานในดัชนีช่องเดียว 2 รายการ คือ (category ASC, __name__ ASC) และ (country ASC, __name__ ASC) สแกนรายการดัชนี 16, 500 รายการ แต่แสดงผล เอกสารเพียง 1200 รายการ

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

// Output query status
{
    "resultsReturned": "1200",
    "executionDuration": "0.118882s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "16500",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}

หากต้องการเพิ่มประสิทธิภาพของการดำเนินการค้นหา คุณสามารถสร้าง ดัชนีผสม (category ASC, country ASC, __name__ ASC) ที่ครอบคลุมทั้งตัว

การเรียกใช้ Query ด้วยตัวเลือกการวิเคราะห์อีกครั้งเราจะเห็นว่า มีการเลือกดัชนีที่สร้างใหม่สำหรับการค้นหานี้ และคำค้นหาจะทำงานได้เร็วขึ้นมาก และมีประสิทธิภาพมากขึ้น

// Output query planning info
{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, country ASC,  __name__ ASC)"}
    ]
}

// Output query stats
{
    "resultsReturned": "1200",
    "executionDuration": "0.026139s",
    "readOperations": "1200",
    "debugStats": {
               "index_entries_scanned": "1200",
               "documents_scanned": "1200"
               "billing_details": {
                     "documents_billable": "1200",
                     "index_entries_billable": "0",
                     "small_ops": "0",
                     "min_query_cost": "0",
               }
    }
}