Tính năng Giải thích truy vấn cho phép bạn gửi truy vấn Cloud Firestore đến phần phụ trợ và nhận lại số liệu thống kê chi tiết về hiệu suất khi thực thi truy vấn phụ trợ. Tính năng này hoạt động giống như thao tác EXPLAIN [ANALYZE] trong nhiều hệ thống cơ sở dữ liệu quan hệ.
Bạn có thể gửi yêu cầu Giải thích truy vấn bằng thư viện ứng dụng máy chủ Firestore.
Kết quả Giải thích truy vấn giúp bạn hiểu cách thực thi truy vấn, cho bạn thấy những điểm không hiệu quả và vị trí của các nút thắt có khả năng xảy ra ở phía máy chủ.
Giải thích truy vấn:
- Cung cấp thông tin chi tiết về giai đoạn lập kế hoạch truy vấn để bạn có thể điều chỉnh chỉ mục truy vấn và tăng hiệu quả.
- Khi sử dụng tuỳ chọn phân tích, tính năng này giúp bạn hiểu chi phí và hiệu suất theo từng truy vấn, đồng thời cho phép bạn nhanh chóng lặp lại các mẫu truy vấn khác nhau để tối ưu hoá việc sử dụng các mẫu đó.
Tìm hiểu các tuỳ chọn Giải thích truy vấn: mặc định và phân tích
Bạn có thể thực hiện các thao tác Giải thích truy vấn bằng tuỳ chọn mặc định hoặc tuỳ chọn phân tích.
Với tuỳ chọn mặc định, tính năng Giải thích truy vấn sẽ lập kế hoạch truy vấn nhưng bỏ qua giai đoạn thực thi. Thao tác này sẽ trả về thông tin về giai đoạn lập kế hoạch. Bạn có thể dùng thông tin này để kiểm tra xem một truy vấn có các chỉ mục cần thiết hay không và hiểu được những chỉ mục nào được sử dụng. Ví dụ: thao tác này sẽ giúp bạn xác minh rằng một truy vấn cụ thể đang sử dụng chỉ mục tổng hợp thay vì phải giao nhau trên nhiều chỉ mục khác nhau.
Với tuỳ chọn phân tích, tính năng Giải thích truy vấn sẽ vừa lập kế hoạch vừa thực thi truy vấn. Thao tác này sẽ trả về tất cả thông tin về trình lập kế hoạch đã đề cập trước đó cùng với số liệu thống kê từ thời gian chạy thực thi truy vấn. Thao tác này sẽ bao gồm thông tin thanh toán của truy vấn cùng với thông tin chi tiết ở cấp hệ thống về việc thực thi truy vấn. Bạn có thể dùng công cụ này để kiểm thử nhiều cấu hình truy vấn và chỉ mục nhằm tối ưu hoá chi phí và độ trễ của các cấu hình đó.
Chi phí của tính năng Giải thích truy vấn là bao nhiêu?
Khi bạn sử dụng tính năng Giải thích truy vấn với tuỳ chọn mặc định, sẽ không có chỉ mục hoặc thao tác đọc nào được thực hiện. Bất kể độ phức tạp của truy vấn, bạn sẽ bị tính phí cho một thao tác đọc.
Khi bạn sử dụng tính năng Giải thích truy vấn với tuỳ chọn phân tích, các thao tác đọc và chỉ mục sẽ được thực hiện, vì vậy, bạn sẽ bị tính phí cho truy vấn như bình thường. Bạn sẽ không phải trả thêm phí cho hoạt động phân tích, mà chỉ phải trả phí thông thường cho truy vấn đang được thực thi.
Sử dụng tính năng Giải thích truy vấn với tuỳ chọn mặc định
Bạn có thể dùng thư viện ứng dụng để gửi yêu cầu tuỳ chọn mặc định.
Xin lưu ý rằng các yêu cầu được xác thực bằng IAM, sử dụng cùng các quyền cho các thao tác truy vấn thông thường. Các kỹ thuật xác thực khác, chẳng hạn như Firebase Authentication, sẽ bị bỏ qua. Để biết thêm thông tin, hãy xem hướng dẫn về IAM cho thư viện ứng dụng máy chủ.
Java (Quản trị viên)
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();
Node (Quản trị viên)
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;
Định dạng chính xác của phản hồi phụ thuộc vào môi trường thực thi. Bạn có thể chuyển đổi kết quả trả về sang JSON. Ví dụ:
{
"indexes_used": [
{"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
{"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
]
}Để biết thêm thông tin, hãy xem tài liệu tham khảo về báo cáo Giải thích truy vấn.
Sử dụng tính năng Giải thích truy vấn với tuỳ chọn phân tích
Bạn có thể dùng thư viện ứng dụng để gửi yêu cầu tuỳ chọn phân tích.
Xin lưu ý rằng các yêu cầu được xác thực bằng IAM, sử dụng cùng các quyền cho các thao tác truy vấn thông thường. Các kỹ thuật xác thực khác, chẳng hạn như Firebase Authentication, sẽ bị bỏ qua. Để biết thêm thông tin, hãy xem hướng dẫn về IAM cho thư viện ứng dụng máy chủ.
Java (Quản trị viên)
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();
Node (Quản trị viên)
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;
Ví dụ sau đây cho thấy đối tượng stats được trả về ngoài planInfo.
Định dạng chính xác của phản hồi phụ thuộc vào môi trường thực thi. Phản hồi mẫu ở định dạng 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",
}
}
}Để biết thêm thông tin, hãy xem tài liệu tham khảo về báo cáo Giải thích truy vấn.
Diễn giải kết quả và điều chỉnh
Hãy xem một tình huống ví dụ trong đó chúng ta truy vấn phim theo thể loại và quốc gia sản xuất.
Để minh hoạ, hãy giả sử tương đương với truy vấn SQL này.
SELECT * FROM /movies WHERE category = 'Romantic' AND country = 'USA';
Nếu chúng ta sử dụng tuỳ chọn phân tích, các chỉ số được trả về sẽ cho thấy truy vấn chạy trên hai chỉ mục một trường, (category ASC, __name__ ASC) và (country ASC, __name__ ASC). Hệ thống sẽ quét 16.500 mục nhập chỉ mục, nhưng chỉ trả về 1.200 tài liệu.
// 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", } } }
Để tối ưu hoá hiệu suất thực thi truy vấn, bạn có thể tạo chỉ mục tổng hợp được bao phủ đầy đủ (category ASC, country ASC, __name__ ASC).
Khi chạy lại truy vấn bằng tuỳ chọn phân tích, chúng ta có thể thấy rằng chỉ mục mới tạo được chọn cho truy vấn này và truy vấn chạy nhanh hơn và hiệu quả hơn nhiều.
// 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", } } }