事件
使用 Azure Cosmos DB Python SDK 取得 SQL 查詢執行計量並分析查詢效能
適用於:NoSQL
本文說明如何使用查詢執行計量來分析 Azure Cosmos DB 上的 SQL 查詢效能。 它包含累計計量,這些計量會匯總至要求的所有實體分割區、每個實體分割區的計量清單,以及要求費用總計。 微調查詢效能一文詳述這些計量。
若要取得查詢計量,您必須在查詢參數中將 旗標設定 populate_query_metrics
為 True
,如下所示。 您可能有興趣啟用索引計量以及進行偵錯,而且您可以將 旗標設定 populate_query_metrics
為 來 True
加以啟用:
results = container.query_items(
query=queryText,
enable_cross_partition_query=True,
populate_index_metrics=True,
populate_query_metrics=True
)
在 Python SDK 中,您可以從容器用戶端讀取 x-ms-documentdb-query-metrics
標頭值,以取得查詢執行計量。 下列代碼段示範如何讀取查詢執行計量:
results = container.query_items(
query=queryText,
enable_cross_partition_query=True,
populate_query_metrics=True
)
items = [item for item in results]
'''
Please note that the last_response_headers are available only after the first iteration of the results as the query execution starts only when result iteration begins
'''
print("Query Metrics: ",container.client_connection.last_response_headers['x-ms-documentdb-query-metrics'])
結果會提供查詢執行相關信息,如下所示:
totalExecutionTimeInMs=0.27;
queryCompileTimeInMs=0.04;
queryLogicalPlanBuildTimeInMs=0.00;
queryPhysicalPlanBuildTimeInMs=0.02;
queryOptimizationTimeInMs=0.00;
VMExecutionTimeInMs=0.02;
indexLookupTimeInMs=0.00;
instructionCount=17;
documentLoadTimeInMs=0.01;
systemFunctionExecuteTimeInMs=0.00;
userFunctionExecuteTimeInMs=0.00;
retrievedDocumentCount=3;
retrievedDocumentSize=1005;
outputDocumentCount=3;
outputDocumentSize=1056;
writeOutputTimeInMs=0.00;
indexUtilizationRatio=1.00
上述結果可讓您深入了解查詢的效率。 您可以查看 totalExecutionTimeInMs,以查看查詢執行所花費的時間長度。 indexUtilizationRatio 可讓您深入了解查詢使用索引的方式。 若要深入瞭解計量,請參閱 查詢執行計量 一文。
您可以擷取讀取 x-ms-request-charge
值所取用的要求單位總計(RU)。 您不需要明確設定任何參數,即可擷取要求費用值。 下列範例示範如何取得每個查詢接續的要求費用:
items = [item for item in results]
print("Request Units consumed: ",container.client_connection.last_response_headers['x-ms-request-charge'])
查看索引使用率可協助您偵錯緩慢的查詢。 良好的索引使用率分數必須接近 1。 無法使用索引的查詢,會在傳回結果集之前,先完整掃描容器中的所有檔。
以下是掃描查詢的範例:
SELECT VALUE c.description
FROM c
WHERE UPPER(c.description) = "BABYFOOD, DESSERT, FRUIT DESSERT, WITHOUT ASCORBIC ACID, JUNIOR"
此查詢的篩選條件使用未經索引處理的系統函數 UPPER。 針對大型集合執行此查詢時,第一次延續會產生下列查詢計量:
QueryMetrics
Retrieved Document Count : 60,951
Retrieved Document Size : 399,998,938 bytes
Output Document Count : 7
Output Document Size : 510 bytes
Index Utilization : 0.00 %
Total Query Execution Time : 4,500.34 milliseconds
Query Preparation Time : 0.2 milliseconds
Index Lookup Time : 0.01 milliseconds
Document Load Time : 4,177.66 milliseconds
Runtime Execution Time : 407.9 milliseconds
Document Write Time : 0.01 milliseconds
在查詢計量輸出中,請注意下列值:
Retrieved Document Count : 60,951
Retrieved Document Size : 399,998,938 bytes
此查詢載入 60,951 個文件,總計 399,998,938 個位元組。 載入如此多位元組導致很高的成本或要求單位費用。 執行此查詢也耗時甚久,從花費總時間屬性即可明白:
Total Query Execution Time : 4,500.34 milliseconds
表示執行查詢花 4.5 秒 (這只是一次延續)。
若要將此範例查詢最佳化,請避免在篩選條件中使用 UPPER。 相反地,在建立或更新文件時,必須以全部大寫字元插入 c.description
值。 於是查詢變成:
SELECT VALUE c.description
FROM c
WHERE c.description = "BABYFOOD, DESSERT, FRUIT DESSERT, WITHOUT ASCORBIC ACID, JUNIOR"
此查詢現在可以經過索引處理。 或者,您可以使用計算屬性來編製系統函數或複雜計算結果的索引,否則會導致完整掃描。
若要查看潛在的索引建議,並檢查已使用哪些索引,您必須將 參數設定 populate_index_metrics
為 True
,然後您可以從容器用戶端讀取 x-ms-documentdb-index-utilization
標頭值。 下列代碼段示範如何讀取索引使用率計量:
results = container.query_items(
query=queryText,
enable_cross_partition_query=True,
populate_index_metrics = True
)
items = [item for item in results]
print("Index Utilization Info: ",container.client_connection.last_response_headers['x-ms-cosmos-index-utilization'])
若要深入了解微調查詢效能,請參閱微調查詢效能一文。
其他資源
訓練
認證
Microsoft Certified: Azure Cosmos DB Developer Specialty - Certifications
透過 Microsoft Azure Cosmos DB 在 SQL API 和 SDK 中撰寫有效率的查詢、建立索引編製原則、管理及佈建資源。
文件
-
適用於 Azure Cosmos DB for NoSQL 的 SQL 查詢計量
了解如何檢測和偵錯 Azure Cosmos DB 要求的 SQL 查詢效能。
-
了解如何在 Azure Cosmos DB 中設定並變更預設的編製索引原則,以便自動編製索引,同時改善效能。
-
了解如何擷取 SQL 查詢執行計量,以及分析 Azure Cosmos DB 要求的 SQL 查詢效能。