Hiểu rõ hiệu suất truy vấn bằng cách sử dụng tính năng Giải thích truy vấn

Tính năng Giải thích truy vấn cho phép bạn gửi các truy vấn Cloud Firestore đến phần phụ trợ và nhận được số liệu thống kê chi tiết về hiệu suất khi thực thi truy vấn phụ trợ. Thao tác 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 hiện các truy vấn, cho bạn biết những điểm không hiệu quả và vị trí có khả năng xảy ra tình trạng tắc nghẽn 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 lựa chọn phân tích, bạn có thể hiểu được chi phí và hiệu suất của mình trên cơ sở mỗi truy vấn và 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.

Tìm hiểu các lựa 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 cách sử dụng lựa chọn mặc định hoặc lựa chọn phân tích.

Với lựa chọn mặc định, Query Explain sẽ lập kế hoạch cho 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ể sử dụng tính năng 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à biết được chỉ mục nào được sử dụng. Điều này sẽ giúp bạn xác minh, chẳng hạn như một truy vấn cụ thể đang sử dụng chỉ mục kết hợp thay vì phải giao nhau trên nhiều chỉ mục khác nhau.

Với lựa chọn phân tích, Query Explain sẽ lập kế hoạch và 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ể sử 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 chúng.

Chi phí cho tính năng Giải thích truy vấn là bao nhiêu?

Khi bạn sử dụng Query Explain với lựa chọn mặc định, 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 vẫn chỉ phải trả phí cho một thao tác đọc.

Khi sử dụng Query Explain với lựa chọn phân tích, các thao tác lập chỉ mục và đọ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. Không có khoản phí bổ sung nào cho hoạt động phân tích, chỉ có khoản phí thông thường cho truy vấn đang được thực thi.

Sử dụng Query Explain với lựa chọn mặc định

Bạn có thể sử dụng thư viện ứng dụng để gửi yêu cầu về lựa 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 một 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ủ.


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;

    

Đị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ề thành 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 phần Thông tin tham khảo về báo cáo Giải thích truy vấn.

Sử dụng Query Explain với lựa chọn phân tích

Bạn có thể sử dụng thư viện ứng dụng để gửi yêu cầu về lựa 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 một 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ủ.


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;

    

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 phần Thông tin 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 ví dụ về tình huống mà 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 lựa 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)(country ASC, __name__ ASC). Nó quét 16.500 mục trong 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 một chỉ mục kết hợp được bao phủ hoàn toàn (category ASC, country ASC, __name__ ASC).

Khi chạy lại truy vấn bằng lựa 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",
               }
    }
}