Query Explain ช่วยให้คุณส่งคำค้นหา Cloud Firestore รายการไปยังแบ็กเอนด์และรับสถิติประสิทธิภาพโดยละเอียดเกี่ยวกับการดำเนินการค้นหาแบ็กเอนด์เป็นการตอบแทน ซึ่งทำงานเหมือนกับการดำเนินการ EXPLAIN [ANALYZE] ในระบบฐานข้อมูลเชิงสัมพันธ์หลายระบบ
คุณส่งคำขอ Query Explain ได้โดยใช้ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ Firestore
ผลลัพธ์ของ Query Explain จะช่วยให้คุณเข้าใจวิธีการดำเนินการค้นหา โดยแสดงความไม่มีประสิทธิภาพและตำแหน่งของคอขวดฝั่งเซิร์ฟเวอร์ที่อาจเกิดขึ้น
Query Explain:
- ให้ข้อมูลเชิงลึกเกี่ยวกับระยะการวางแผนการค้นหาเพื่อให้คุณปรับดัชนีการค้นหาและเพิ่มประสิทธิภาพได้
- การใช้ตัวเลือกการวิเคราะห์จะช่วยให้คุณเข้าใจค่าใช้จ่ายและประสิทธิภาพตามการค้นหาแต่ละครั้ง และช่วยให้คุณทำซ้ำรูปแบบการค้นหาต่างๆ ได้อย่างรวดเร็วเพื่อเพิ่มประสิทธิภาพการใช้งาน
ทำความเข้าใจตัวเลือก Query Explain: ค่าเริ่มต้นและวิเคราะห์
การดำเนินการ Query Explain สามารถทำได้โดยใช้ตัวเลือกค่าเริ่มต้นหรือตัวเลือกวิเคราะห์
เมื่อใช้ตัวเลือกเริ่มต้น Query Explain จะวางแผนการค้นหา แต่ข้ามขั้นตอนการดำเนินการ การดำเนินการนี้จะแสดงข้อมูลระยะของเครื่องมือวางแผน คุณสามารถใช้เครื่องมือนี้เพื่อตรวจสอบว่าการค้นหามีดัชนีที่จำเป็นและทำความเข้าใจว่ามีการใช้ดัชนีใดบ้าง ซึ่งจะช่วยให้คุณยืนยันได้ เช่น การค้นหาหนึ่งๆ ใช้ดัชนีแบบผสมแทนที่จะต้องตัดกันในดัชนีต่างๆ มากมาย
เมื่อใช้ตัวเลือกการวิเคราะห์ Query Explain จะทั้งวางแผนและดำเนินการค้นหา ซึ่งจะแสดงข้อมูลเครื่องมือวางแผนทั้งหมดที่กล่าวถึงก่อนหน้านี้พร้อมกับสถิติจากรันไทม์การดำเนินการค้นหา ซึ่งจะรวมข้อมูลสำหรับการเรียกเก็บเงินของคำค้นหาพร้อมกับข้อมูลเชิงลึกระดับระบบเกี่ยวกับการดำเนินการค้นหา คุณสามารถใช้เครื่องมือนี้เพื่อทดสอบการกำหนดค่าการค้นหาและดัชนีต่างๆ เพื่อเพิ่มประสิทธิภาพต้นทุนและเวลาในการตอบสนอง
Query Explain มีค่าใช้จ่ายเท่าใด
เมื่อคุณใช้ Query Explain กับตัวเลือกเริ่มต้น ระบบจะไม่ดำเนินการจัดทำดัชนีหรือการอ่าน ระบบจะเรียกเก็บเงินสำหรับการดำเนินการอ่าน 1 ครั้ง ไม่ว่าคำค้นหาจะซับซ้อนเพียงใดก็ตาม
เมื่อใช้ Query Explain กับตัวเลือกการวิเคราะห์ ระบบจะดำเนินการจัดทำดัชนีและการอ่าน ดังนั้นคุณจะถูกเรียกเก็บเงินสำหรับการค้นหาตามปกติ ไม่มีค่าใช้จ่ายเพิ่มเติมสำหรับกิจกรรมการวิเคราะห์ มีเพียงค่าใช้จ่ายตามปกติสำหรับการค้นหาที่ดำเนินการ
ใช้ Query Explain กับตัวเลือกเริ่มต้น
คุณใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคำขอตัวเลือกเริ่มต้นได้
โปรดทราบว่าคำขอจะได้รับการตรวจสอบสิทธิ์ด้วย 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
ใช้ Query Explain กับตัวเลือก analyze
คุณสามารถใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคำขอตัวเลือกการวิเคราะห์ได้
โปรดทราบว่าคำขอจะได้รับการตรวจสอบสิทธิ์ด้วย 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",
}
}
}ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิงรายงาน Query Explain
ตีความผลลัพธ์และทำการปรับเปลี่ยน
ลองดูตัวอย่างสถานการณ์ที่เราค้นหาภาพยนตร์ตามประเภทและประเทศที่ผลิต
สมมติว่าการค้นหา SQL นี้เทียบเท่ากับตัวอย่าง
SELECT * FROM /movies WHERE category = 'Romantic' AND country = 'USA';
หากเราใช้ตัวเลือก analyze เมตริกที่แสดงผลจะแสดงการค้นหาที่ทำงานในดัชนีช่องเดียว 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", } } }