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

Giải thích truy vấn cho phép bạn gửi truy vấn Cloud Firestore đến phụ trợ và nhận số liệu thống kê chi tiết về hiệu suất về quá trình thực thi truy vấn phụ trợ của bạn. 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 của máy chủFirestore.

Kết quả Giải thích truy vấn giúp bạn hiểu truy vấn của bạn được thực thi, cho bạn thấy các hoạt động không hiệu quả và vị trí của các phần có thể phía máy chủ điểm tắc nghẽn.

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 truy vấn của mình lập chỉ mục và tăng tính hiệu quả.
  • Khi sử dụng tuỳ chọn phân tích, bạn có thể nắm được chi phí và hiệu suất của mình trên trên cơ sở từng truy vấn và cho phép bạn nhanh chóng lặp lại thông qua truy vấn khác nhau nhằm tối ưu hoá việc sử dụng của họ.

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 lựa chọn mặc định hoặc phân tích.

Với tuỳ chọn mặc định, tính năng Giải thích truy vấn lập kế hoạch truy vấn nhưng bỏ qua trong 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 đoạn 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 chỉ mục được sử dụng. Điều này sẽ giúp bạn xác minh, ví dụ, rằng một đang sử dụng chỉ mục tổng hợp thay vì phải giao nhau trên nhiều chỉ mục chỉ mục.

Với tuỳ chọn phân tích, 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ề kế hoạch làm việc đã đề 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. Điều này sẽ bao gồm thông tin thanh toán thông tin của truy vấn cùng với thông tin chi tiết cấp hệ thống về truy vấn thực thi. Bạn có thể sử dụng công cụ này để kiểm tra nhiều truy vấn và chỉ mục để tối ưu hoá chi phí và độ trễ.

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ó hoạt động lập chỉ mục hoặc đọc nào sẽ đượ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, lập chỉ mục và đọc các thao tác được thực hiện, vì vậy bạn bị tính phí cho truy vấn như bình thường. Không có ngôn ngữ nào khác phí cho hoạt động phân tích, chỉ khoản phí thông thường cho truy vấn được thực thi.

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, cũng sử dụng 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, cũng sử dụng 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. Chiến lược phát hành đĩa đơn 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ả đị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, số liệu được trả về sẽ cho biết truy vấn chạy trên hai chỉ mục trường đơn là (category ASC, __name__ ASC)(country ASC, __name__ ASC). Nó quét 16500 mục nhập trong chỉ mục nhưng trả về chỉ 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 một chỉ mục tổng hợp có bao phủ đầy đủ (category ASC, country ASC, __name__ ASC).

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 sẽ được chọn cho truy vấn này và truy vấn chạy nhanh hơn nhiều và hiệu quả hơn.

// 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",
               }
    }
}