คําอธิบายการค้นหาช่วยให้คุณส่งการค้นหา Cloud Firestore ไปยังแบ็กเอนด์และรับสถิติประสิทธิภาพโดยละเอียดเกี่ยวกับการเรียกใช้การค้นหาแบ็กเอนด์ ซึ่งทำงานเหมือนกับการดำเนินการ EXPLAIN [ANALYZE]
ในระบบฐานข้อมูลเชิงสัมพันธ์หลายระบบ
คุณส่งคำขออธิบายการค้นหาได้โดยใช้ไลบรารีไคลเอ็นต์เซิร์ฟเวอร์ Firestore
ผลการอธิบายการค้นหาจะช่วยให้คุณเข้าใจวิธีดำเนินการค้นหา โดยแสดงถึงจุดที่ไม่มีประสิทธิภาพและตำแหน่งของคอขวดฝั่งเซิร์ฟเวอร์ที่เป็นไปได้
คำอธิบายการค้นหา:
- ให้ข้อมูลเชิงลึกเกี่ยวกับระยะการวางแผนการค้นหาเพื่อให้คุณปรับดัชนีการค้นหาและเพิ่มประสิทธิภาพได้
- การใช้ตัวเลือก "วิเคราะห์" จะช่วยให้คุณเข้าใจต้นทุนและประสิทธิภาพตามการค้นหาแต่ละรายการ และช่วยให้คุณวนดูรูปแบบการค้นหาต่างๆ ได้อย่างรวดเร็วเพื่อเพิ่มประสิทธิภาพการใช้งาน
ทําความเข้าใจตัวเลือกคําอธิบายการค้นหา: ค่าเริ่มต้นและวิเคราะห์
การดำเนินการอธิบายการค้นหาทำได้โดยใช้ตัวเลือกเริ่มต้นหรือตัวเลือกวิเคราะห์
เมื่อใช้ตัวเลือกเริ่มต้น คำอธิบายการค้นหาจะวางแผนการค้นหา แต่ข้ามระยะการดําเนินการ ซึ่งจะแสดงข้อมูลระยะของแผน คุณสามารถใช้ฟีเจอร์นี้เพื่อตรวจสอบว่าข้อความค้นหามีดัชนีที่จําเป็นและเข้าใจว่าดัชนีใดบ้างที่ใช้ ซึ่งจะช่วยให้คุณยืนยันได้ เช่น การค้นหาหนึ่งๆ ใช้ดัชนีคอมโพสิทแทนที่จะต้องตัดกันกับดัชนีหลายรายการ
เมื่อใช้ตัวเลือก "วิเคราะห์" ข้อความอธิบายการค้นหาจะแสดงทั้งแผนการค้นหาและดำเนินการค้นหา ซึ่งจะแสดงข้อมูลเครื่องมือวางแผนที่กล่าวถึงก่อนหน้านี้ทั้งหมดพร้อมกับสถิติจากรันไทม์ของการดำเนินการค้นหา ซึ่งจะรวมถึงข้อมูลการเรียกเก็บเงินของคําค้นหา รวมถึงข้อมูลเชิงลึกระดับระบบเกี่ยวกับการดําเนินการค้นหา คุณสามารถใช้เครื่องมือนี้เพื่อทดสอบการค้นหาและการกําหนดค่าดัชนีต่างๆ เพื่อเพิ่มประสิทธิภาพต้นทุนและเวลาในการตอบสนอง
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)"}, ] }
ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิงรายงานคำอธิบายการค้นหา
ใช้คําอธิบายการค้นหากับตัวเลือก "วิเคราะห์"
คุณสามารถใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคําขอตัวเลือกการวิเคราะห์ได้
โปรดทราบว่าคำขอจะได้รับการตรวจสอบสิทธิ์ด้วย 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 รายการ แต่แสดงผลเอกสารเพียง 1,200 รายการ
// 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)
เพื่อเพิ่มประสิทธิภาพการดำเนินการค้นหา
เมื่อเรียกใช้การค้นหาด้วยตัวเลือก "วิเคราะห์" อีกครั้ง เราพบว่าระบบเลือกดัชนีที่สร้างขึ้นใหม่สําหรับการค้นหานี้ และการค้นหาทํางานได้เร็วขึ้นและมีประสิทธิภาพมากขึ้น
// 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", } } }