Obtenga métricas de ejecución de consultas SQL y analice el rendimiento de las consultas mediante el SDK para Python de Azure Cosmos DB

En este artículo se muestra cómo generar perfiles de rendimiento de consultas SQL en Azure Cosmos DB mediante métricas de ejecución de consultas. Contiene métricas acumulativas que se agregan en todas las particiones físicas de la solicitud, una lista de métricas para cada partición física y el cargo total de la solicitud. Estas métricas se documentan con más detalle en el artículo Ajuste el rendimiento de las consultas.

Habilitar métricas de consulta

Para obtener métricas de consulta, debe establecer la marca populate_query_metrics en True en los parámetros de consulta, como se indica a continuación. Puede que le interese habilitar también las métricas de índice con fines de depuración y puede habilitarlas estableciendo la marca populate_query_metrics en True:

results = container.query_items(
    query=queryText,
    enable_cross_partition_query=True,
    populate_index_metrics=True,
    populate_query_metrics=True
)

Obtención de métricas de ejecución de consultas

En el SDK de Python, puede leer los valores de encabezado x-ms-documentdb-query-metrics del cliente contenedor para obtener las métricas de ejecución de la consulta. El siguiente fragmento de código muestra cómo leer las métricas de ejecución de consultas:

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'])

El resultado le proporcionará información relacionada con la ejecución de consultas como se indica a continuación:

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

Los resultados anteriores pueden proporcionarle información sobre la eficacia de la consulta. Puede consultar el totalExecutionTimeInMs para ver cuánto tiempo tardó en ejecutarse la consulta. IndexUtilizationRatio puede proporcionarle información sobre el rendimiento de la consulta mediante el índice. Para conocer las métricas en detalle, consulte el artículo Métricas de ejecución de consultas.

Obtener el cargo de la solicitud de consulta

Puede capturar las Unidades de Solicitud Totales (RUs) consumidas leyendo el valor de x-ms-request-charge. No es necesario establecer ningún parámetro explícitamente para recuperar el valor de cargo de solicitud. El siguiente ejemplo muestra cómo obtener la carga de solicitud para cada continuación de una consulta:

items = [item for item in results]
print("Request Units consumed: ",container.client_connection.last_response_headers['x-ms-request-charge'])

Obtener el uso del índice

Examinar el uso del índice puede ayudarle a depurar consultas lentas. Una buena puntuación de uso del índice debe estar cerca de 1. Las consultas que no pueden usar el índice dan como resultado un examen completo de todos los documentos de un contenedor antes de devolver el conjunto de resultados.

A continuación, se muestra un ejemplo de una consulta de escaneo:

SELECT VALUE c.description 
FROM   c 
WHERE UPPER(c.description) = "BABYFOOD, DESSERT, FRUIT DESSERT, WITHOUT ASCORBIC ACID, JUNIOR"

El filtro de esta consulta utiliza la función del sistema UPPER, la cual no es servida desde el índice. La ejecución de esta consulta en una colección grande genera las siguientes métricas de consulta para la primera continuación:

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

Observe los siguientes valores de la salida de las métricas de consulta:

Retrieved Document Count                 :          60,951
Retrieved Document Size                  :     399,998,938 bytes

Esta consulta cargó 60 951 documentos, que sumaban un total de 399 998 938 bytes. La carga de esta cantidad de bytes resulta en un costo elevado o un cargo alto por unidad de solicitud. También se tarda mucho tiempo en ejecutar la consulta, lo que se ve claramente con la propiedad de tiempo total transcurrido:

Total Query Execution Time               :        4,500.34 milliseconds

Esto significa que la consulta tardó 4,5 segundos en ejecutarse (y solo era una continuación).

Para optimizar esta consulta de ejemplo, evite el uso de UPPER en el filtro. En su lugar, cuando se crean o actualizan los documentos, los valores c.description se deben insertar completamente en mayúsculas. La consulta se convierte en lo siguiente:

SELECT VALUE c.description 
FROM   c 
WHERE c.description = "BABYFOOD, DESSERT, FRUIT DESSERT, WITHOUT ASCORBIC ACID, JUNIOR"

Ahora esta consulta puede servirse desde el índice. Como alternativa, puede usar propiedades calculadas para indexar los resultados de las funciones del sistema o cálculos complejos que, de lo contrario, generarían un examen completo.

Para echar un vistazo a las posibles recomendaciones de índice y comprobar qué índices se han utilizado, debe establecer el parámetro populate_index_metrics en True y luego puede leer los valores de encabezado x-ms-documentdb-index-utilization del cliente contenedor. El siguiente fragmento de código muestra cómo leer las métricas de uso de índices:

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'])

Para más información acerca de cómo ajustar el rendimiento de las consultas, consulte el artículo Ajuste del rendimiento de las consultas.

References

Pasos siguientes