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 của Cloud Firestore đến phần phụ trợ và nhận số liệu thống kê chi tiết về hiệu suất khi thực thi truy vấn phụ trợ. Lớp này hoạt động như toán tử 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 của máy chủFirestore.

Kết quả Giải thích truy vấn giúp bạn hiểu cách các truy vấn của mình được thực thi, cho bạn thấy những điểm không hiệu quả và vị trí có thể gây 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ả.
  • Việc sử dụng tuỳ chọn phân tích giúp bạn hiểu rõ chi phí và hiệu suất trên cơ sở 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á mức sử dụng những mẫu đó.

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 thao tác Giải thích truy vấn bằng cách sử dụ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 lên 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 giai đoạn của trình lập kế hoạch. Bạn có thể sử dụng chỉ mục này để kiểm tra nhằm đảm bảo rằng một truy vấn có các chỉ mục cần thiết và biết được chỉ mục nào được sử dụng. Ví dụ: điều 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 cho cả hai 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ê trong thời gian chạy thực thi truy vấn. Thông tin 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 các cấu hình đó.

Giải thích Truy vấn có chi phí gì?

Khi bạn sử dụng Giải thích truy vấn với tuỳ chọn mặc định, sẽ không có thao tác lập chỉ mục hoặc đọc nào được thực hiện. Bất kể truy vấn có mức độ phức tạp như thế nào, hệ thống vẫn sẽ tính phí một thao tác đọc.

Khi bạn sử dụng Giải thích truy vấn với tuỳ 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 bị tính phí cho truy vấn như bình thường. Bạn không phải trả thêm phí cho hoạt động phân tích mà chỉ phải trả mức phí thông thường cho việc thực thi truy vấn.

Sử dụ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 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ác quyền tương tự cho các thao tác truy vấn thông thường. Các kỹ thuật xác thực khác, như Xác thực Firebase, 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 của 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();

    
Nút (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. Kết quả trả về có thể được chuyển đổi sang định dạng 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 Giải thích truy vấn với tùy 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 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ác quyền tương tự cho các thao tác truy vấn thông thường. Các kỹ thuật xác thực khác, như Xác thực Firebase, 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 của 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();

    
Nút (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 ví dụ ở đị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 tôi truy vấn phim theo thể loại và quốc gia sản xuất.

Để minh hoạ, hãy giả định 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 2 chỉ mục trường đơn là (category ASC, __name__ ASC)(country ASC, __name__ ASC). Phương thức này quét 16500 mục nhập chỉ mục, nhưng chỉ trả về 1200 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 (category ASC, country ASC, __name__ ASC).

Khi chạy truy vấn với tuỳ chọn phân tích một lần nữa, 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 sẽ 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",
               }
    }
}