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

Query Explain cho phép bạn gửi các 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ợ. Hàm này hoạt động giố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 máy chủ Firestore.

Kết quả của tính năng Giải thích truy vấn giúp bạn hiểu cách thực thi truy vấn, cho bạn biết những điểm không hiệu quả và vị trí của các nút thắt cổ chai có thể 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 các 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 được chi phí và hiệu suất trên cơ sở mỗi truy vấn, đồng thời cho phép bạn nhanh chóng lặp lại nhiều mẫu truy vấn để tối ưu hoá việc sử dụng các mẫu đó.

Tìm hiểu về 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 của trình lập kế hoạch. Bạn có thể sử dụng hàm 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ụ: đ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, Truy vấn giải thích 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ê từ thời gian chạy thực thi truy vấn. Báo cáo 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 đó.

Tính năng Giải thích truy vấn có tính phí không?

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, hệ thống sẽ không thực hiện bất kỳ hoạt động lập chỉ mục hoặc đọc nào. Bất kể độ phức tạp của truy vấn, bạn sẽ bị tính phí 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 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. 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ể sử 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 hoạt động 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ị)

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. 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 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ể sử dụng thư viện ứng dụng để gửi yêu cầu phân tích tuỳ chọn.

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 hoạt động 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ị)

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 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 xét một tình huống mẫu 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ả định truy vấn SQL tương đương với truy vấn 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 trường đơn, (category ASC, __name__ ASC)(country ASC, __name__ ASC). Công cụ này quét 16.500 mục 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 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",
               }
    }
}