使用查詢說明功能瞭解查詢效能

透過查詢說明,您就能將 Cloud Firestore 查詢提交至 並且接收後端查詢執行的詳細效能統計資料。 傳回的結果。其功能與許多 EXPLAIN [ANALYZE] 運算類似 關聯資料庫系統

您可以使用 Firestore 伺服器用戶端程式庫傳送查詢說明要求。

查詢說明結果有助您瞭解查詢內容 以顯示出效率不佳與可能伺服器端的位置

查詢說明:

  • 提供有關查詢規劃階段的深入分析資訊,以便調整查詢 索引並提高效率
  • 使用分析選項,您就能瞭解 並針對不同查詢執行快速疊代 才能最佳化用量

瞭解查詢說明選項:預設與分析

查詢說明作業可以使用 default 選項或 analyze 選項。

若以預設選項,Query Explain 能規劃查詢,但會略過 執行預測系統隨即會傳回規劃工具的階段資訊。你可以 用於檢查查詢是否具備必要的索引,並找出 索引。這有助於您驗證 查詢是使用複合式索引,而且必須在許多不同的 索引。

使用分析選項時,「查詢說明」會同時執行兩個計畫 。這會傳回所有先前提及的規劃工具資訊,以及 查詢執行執行階段的統計資料包括帳單 以及查詢的系統層級深入分析 您可以使用這項工具測試各種查詢和索引 來最佳化成本和延遲時間

什麼是查詢說明費用?

透過預設選項使用查詢說明時,則不會執行索引或讀取作業 執行指令無論查詢的複雜度為何,系統都會收取一項讀取作業的費用。

搭配分析選項、索引和讀取作業使用查詢說明時 因此系統會照常向您收取查詢費用。沒有 則只收取分析活動的一般費用 執行狀態

以預設選項使用查詢說明

您可以使用用戶端程式庫提交預設選項要求。

請注意,系統會使用 IAM 驗證要求 權限較高的政策其他驗證技術,例如 Firebase 驗證則會忽略。詳情請參閱 伺服器用戶端程式庫適用的 IAM

Java (管理員)

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;

    

回應的確切格式視執行環境而定。 傳回的結果可轉換為 JSON。例如:

{
    "indexes_used": [
        {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"},
        {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"},
    ]
}

詳情請參閱查詢說明報表參考資料

搭配分析選項使用查詢說明

您可以使用用戶端程式庫提交分析選項要求。

請注意,系統會使用 IAM 驗證要求 權限較高的政策其他驗證技術,例如 Firebase 驗證則會忽略。詳情請參閱 伺服器用戶端程式庫適用的 IAM

Java (管理員)

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;

    

以下範例顯示除了 planInfo 以外,系統傳回的 stats 物件。 回應的確切格式視執行環境而定。 範例回應會採用 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",
               }
    }

}

詳情請參閱查詢說明報表參考資料

解讀結果並進行調整

讓我們看以下的情境範例,我們按類型和類型查詢電影 生產。

為方便說明,假設這個 SQL 查詢相當於這個 SQL 查詢。

SELECT *
FROM /movies
WHERE category = 'Romantic' AND country = 'USA';

如果我們使用分析選項,傳回的指標就會顯示查詢內容 會在兩個單一欄位索引 ((category ASC, __name__ ASC)) 上執行 (country ASC, __name__ ASC)。掃描 16500 個索引項目,但是會傳回 最多 1200 份文件

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

如要最佳化執行查詢的效能,您可以建立 完整涵蓋的複合式索引 (category ASC, country ASC, __name__ ASC)

再次使用分析選項執行查詢 為這項查詢選取新建立的索引,該查詢的執行速度會更快 更有效率地

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