Compartir a través de


Referencia de la tabla del sistema del historial de consultas

Important

Esta tabla del sistema está en versión preliminar pública.

En este artículo se incluye información sobre la tabla del sistema del historial de consultas, incluido un esquema del esquema de la tabla.

Ruta de acceso de tabla: esta tabla del sistema se encuentra en system.query.history.

Uso de la tabla del historial de consultas

La tabla de historial de consultas incluye registros para las consultas que se ejecutan mediante almacenes SQL o proceso sin servidor para cuadernos y trabajos. La tabla incluye registros de toda la cuenta de todas las áreas de trabajo de la misma región desde la que se accede a la tabla.

De manera predeterminada, solo los administradores tienen acceso a la tabla del sistema. Si desea compartir los datos de la tabla con un usuario o grupo, Databricks recomienda crear una vista dinámica para cada usuario o grupo. Consulte Creación de una vista dinámica.

Esquema de la tabla del sistema del historial de consultas

La tabla del historial de consultas usa el esquema siguiente:

Nombre de la columna Tipo de dato Description Example
account_id string Id. de la cuenta. 11e22ba4-87b9-4cc2
-9770-d10b894b7118
workspace_id string Id. del área de trabajo donde se ejecutó la consulta. 1234567890123456
statement_id string Id. que identifica de forma única la ejecución de la instrucción. Puede usar este identificador para buscar la ejecución de la instrucción en la interfaz de usuario del Historial de Consultas. 7a99b43c-b46c-432b
-b0a7-814217701909
session_id string Id. de sesión de Spark. 01234567-cr06-a2mp
-t0nd-a14ecfb5a9c2
execution_status string Estado de finalización de la instrucción. Los valores posibles son:
  • FINISHED: la ejecución se realizó correctamente.
  • FAILED: error de ejecución con el motivo del error descrito en el mensaje de error adjunto.
  • CANCELED: se canceló la ejecución
FINISHED
compute struct Estructura que representa el tipo de recurso de proceso usado para ejecutar la instrucción y el id. del recurso cuando corresponda. El valor type será WAREHOUSE o SERVERLESS_COMPUTE. {
type: WAREHOUSE,
cluster_id: NULL,
warehouse_id: ec58ee3772e8d305
}
executed_by_user_id string Id. del usuario que ejecutó la instrucción. 2967555311742259
executed_by string Dirección de correo electrónico o nombre del usuario que ejecutó la instrucción. example@databricks.com
statement_text string Texto de la instrucción SQL. Si ha configurado claves administradas por el cliente, statement_text está vacío. Debido a las limitaciones de almacenamiento, se comprimen los valores de texto de declaraciones más largos. Incluso con la compresión, usted puede alcanzar un límite de caracteres. SELECT 1
statement_type string Tipo de declaración. Por ejemplo, ALTER, COPY y INSERT. SELECT
error_message string Mensaje que describe la condición de error. Si ha configurado claves administradas por el cliente, error_message está vacío. [INSUFFICIENT_PERMISSIONS]
Insufficient privileges:
User does not have
permission SELECT on table
'default.nyctaxi_trips'.
client_application string Aplicación cliente que ejecutó la instrucción. Por ejemplo: Editor de SQL de Databricks, Tableau y Power BI. Este campo se deriva de la información proporcionada por las aplicaciones cliente. Aunque se espera que los valores permanezcan estáticos con el tiempo, esto no se puede garantizar. Databricks SQL Editor
client_driver string El conector utilizado para conectarse a Databricks y ejecutar la instrucción. Por ejemplo: Databricks SQL Driver for Go, Databricks ODBC Driver, Databricks JDBC Driver. Databricks JDBC Driver
cache_origin_statement_id string Para los resultados de la consulta capturados de la memoria caché, este campo contiene el identificador de instrucción de la consulta que insertó originalmente el resultado en la memoria caché. Si el resultado de la consulta no se captura de la memoria caché, este campo contiene el identificador de instrucción propio de la consulta. 01f034de-5e17-162d
-a176-1f319b12707b
total_duration_ms bigint Tiempo total de ejecución de la instrucción en milisegundos (excepto el tiempo de captura de resultados). 1
waiting_for_compute_duration_ms bigint Tiempo de espera para el aprovisionamiento de recursos de cómputo, en milisegundos. 1
waiting_at_capacity_duration_ms bigint Tiempo dedicado a esperar en cola por la capacidad de proceso disponible, en milisegundos. 1
execution_duration_ms bigint Tiempo dedicado a ejecutar la instrucción, en milisegundos. 1
compilation_duration_ms bigint Tiempo dedicado a la carga de los metadatos y la optimización de la instrucción, en milisegundos. 1
total_task_duration_ms bigint Suma de todas las duraciones de tareas, en milisegundos. Representa el tiempo combinado necesario para ejecutar la consulta en todos los núcleos de todos los nodos. Puede ser significativamente mayor que la duración del reloj si se ejecutan varias tareas en paralelo. Puede ser menor que la duración del reloj si las tareas esperan por los nodos disponibles. 1
result_fetch_duration_ms bigint Tiempo dedicado, en milisegundos, a la captura de resultados de la instrucción una vez finalizada la ejecución. 1
start_time timestamp Hora a la que Databricks recibió la solicitud. La información de zona horaria se registra al final del valor con +00:00, que representa la hora UTC. 2022-12-05T00:00:00.000+0000
end_time timestamp Hora en que finalizó la ejecución de la instrucción, excluyendo el tiempo de captura de resultados. La información de zona horaria se registra al final del valor con +00:00, que representa la hora UTC. 2022-12-05T00:00:00.000+00:00
update_time timestamp Hora en que la declaración recibió una actualización de progreso por última vez. La información de zona horaria se registra al final del valor con +00:00, que representa la hora UTC. 2022-12-05T00:00:00.000+00:00
read_partitions bigint Número de particiones leídas después de la eliminación. 1
pruned_files bigint Número de archivos eliminados. 1
read_files bigint Número de archivos leídos después del recorte. 1
read_rows bigint Número total de filas leídas por la instrucción. 1
produced_rows bigint Número total de filas devueltas por la instrucción. 1
read_bytes bigint Tamaño total de datos leídos por la instrucción, en bytes. 1
read_io_cache_percent int El porcentaje de bytes de datos persistentes que se leen de la memoria caché de I/O. 50
from_result_cache boolean TRUE indica que el resultado de la consulta se recuperó de la memoria caché. TRUE
spilled_local_bytes bigint Tamaño de los datos, en bytes, escritos temporalmente en el disco mientras se ejecuta la instrucción. 1
written_bytes bigint Tamaño de los datos persistentes, en bytes, escritos en el almacenamiento de objetos en la nube. 1
written_rows bigint Número de filas de datos persistentes escritos en el almacenamiento de objetos en la nube. 1
written_files bigint Número de archivos de datos persistentes escritos en el almacenamiento de objetos en la nube. 1
shuffle_read_bytes bigint Cantidad total de los datos, en bytes, enviados a través de la red. 1
query_source struct Estructura que contiene pares clave-valor que representan entidades de Databricks implicadas en la ejecución de esta instrucción, como trabajos, cuadernos o paneles. Este campo solo registra entidades de Databricks. {
alert_id: 81191d77-184f-4c4e-9998-b6a4b5f4cef1,
sql_query_id: null,
dashboard_id: null,
notebook_id: null,
job_info: {
job_id: 12781233243479,
job_run_id: null,
job_task_run_id: 110373910199121
},
legacy_dashboard_id: null,
genie_space_id: null
}
query_parameters struct Una estructura que contiene parámetros nombrados y posicionales utilizados en consultas parametrizadas. Los parámetros con nombre se representan como pares clave-valor que asignan nombres de parámetro a valores. Los parámetros posicionales se representan como una lista donde el índice indica la posición del parámetro. Solo un tipo (denominado o posicional) puede estar presente a la vez. {
named_parameters: {
"param-1": 1,
"param-2": "hello"
},
pos_parameters: null,
is_truncated: false
}
executed_as string Nombre del usuario o entidad de servicio cuyo privilegio se usó para ejecutar la instrucción. example@databricks.com
executed_as_user_id string Identificador del usuario o principal de servicio cuyo privilegio se usó para ejecutar el comando. 2967555311742259

Visualización del perfil de consulta de un registro

Para ir al perfil de consulta de una consulta en función de un registro de la tabla del historial de consultas, haga lo siguiente:

  1. Identifique el registro de interés y, a continuación, copie el statement_id del registro.
  2. Consulte el identificador del registro workspace_id para asegurarse de que ha iniciado sesión en el mismo entorno de trabajo que el registro.
  3. Haga clic en el icono Historial.Historial de consultas en la barra lateral del área de trabajo.
  4. En el campo Id. de instrucción, pegue el statement_id en el registro.
  5. Haga clic en el nombre de una consulta. Aparece información general de las métricas de consulta.
  6. Haga clic en Ver perfil de consulta.

Comprender la columna query_source

La query_source columna contiene un conjunto de identificadores únicos de las entidades de Azure Databricks implicadas en la ejecución de la instrucción.

Si la query_source columna contiene varios identificadores, significa que la ejecución de la instrucción se desencadenó mediante varias entidades. Por ejemplo, un resultado de trabajo puede desencadenar una alerta que llama a una consulta SQL. En este ejemplo, los tres identificadores se rellenarán dentro de query_source. Los valores de esta columna no se ordenan por orden de ejecución.

Los posibles orígenes de consulta son:

Combinaciones válidas de query_source

En los ejemplos siguientes se muestra cómo se rellena la query_source columna en función de cómo se ejecuta la consulta:

  • Las consultas ejecutadas durante una ejecución de trabajo incluyen una estructura rellenada job_info :

    {
    alert_id: null,
    sql_query_id: null,
    dashboard_id: null,
    notebook_id: null,
    job_info: {
    job_id: 64361233243479,
    job_run_id: null,
    job_task_run_id: 110378410199121
    },
    legacy_dashboard_id: null,
    genie_space_id: null
    }

  • Las consultas de los paneles heredados incluyen un sql_query_id y un legacy_dashboard_id:

    {
    alert_id: null,
    sql_query_id: 7336ab80-1a3d-46d4-9c79-e27c45ce9a15,
    dashboard_id: null,
    notebook_id: null,
    job_info: null,
    legacy_dashboard_id: 1a735c96-4e9c-4370-8cd7-5814295d534c,
    genie_space_id: null
    }

  • Las consultas de alertas incluyen un sql_query_id y un alert_id:

    {
    alert_id: e906c0c6-2bcc-473a-a5d7-f18b2aee6e34,
    sql_query_id: 7336ab80-1a3d-46d4-9c79-e27c45ce9a15,
    dashboard_id: null,
    notebook_id: null,
    job_info: null,
    legacy_dashboard_id: null,
    genie_space_id: null
    }

  • Las consultas de los paneles incluyen dashboard_id, pero no job_info:

    {
    alert_id: null,
    sql_query_id: null,
    dashboard_id: 887406461287882,
    notebook_id: null,
    job_info: null,
    legacy_dashboard_id: null,
    genie_space_id: null
    }

Materialización del historial de consultas desde el metastore

El código siguiente se puede usar para crear un trabajo que se ejecuta cada hora, diariamente, o semanalmente para materializar el historial de consultas desde un metastore. Ajuste las variables HISTORY_TABLE_PATH y LOOKUP_PERIOD_DAYS en consecuencia.

from delta.tables import *
from pyspark.sql.functions import *
from pyspark.sql.types import *

HISTORY_TABLE_PATH = "jacek.default.history"
# Adjust the lookup period according to your job schedule
LOOKUP_PERIOD_DAYS = 1

def table_exists(table_name):
    try:
        spark.sql(f"describe table {table_name}")
        return True
    except Exception:
        return False

def save_as_table(table_path, df, schema, pk_columns):
    deltaTable = (
        DeltaTable.createIfNotExists(spark)
        .tableName(table_path)
        .addColumns(schema)
        .execute()
    )

    merge_statement = " AND ".join([f"logs.{col}=newLogs.{col}" for col in pk_columns])

    result = (
        deltaTable.alias("logs")
        .merge(
            df.alias("newLogs"),
            f"{merge_statement}",
        )
        .whenNotMatchedInsertAll()
        .whenMatchedUpdateAll()
        .execute()
    )
    result.show()

def main():
    df = spark.read.table("system.query.history")
    if table_exists(HISTORY_TABLE_PATH):
        df = df.filter(f"update_time >= CURRENT_DATE() - INTERVAL {LOOKUP_PERIOD_DAYS} days")
    else:
        print(f"Table {HISTORY_TABLE_PATH} does not exist. Proceeding to copy the whole source table.")

    save_as_table(
        HISTORY_TABLE_PATH,
        df,
        df.schema,
        ["workspace_id", "statement_id"]
    )

main()

Análisis de la popularidad de las tablas, incluidas las consultas almacenadas en caché

La tabla del sistema de linaje de tablas no emite entradas para los resultados de la consulta de la caché de resultados. Por este motivo, debe combinar la tabla del historial de consultas con la tabla del sistema de linaje de tablas para incluir consultas almacenadas en caché en el análisis.

Por ejemplo, la consulta siguiente recupera tablas con consultas que superan una hora de tiempo de ejecución en los últimos 7 días:

SELECT
    t.source_table_full_name,
    COUNT(*) AS num_of_queries_over_hour
FROM
    system.query.history h
    INNER JOIN system.access.table_lineage t
        ON t.statement_id = h.cache_origin_statement_id
WHERE
    h.total_duration_ms > 3600000
    AND t.event_time > CURRENT_TIMESTAMP() - INTERVAL 7 DAYS
    AND t.source_table_full_name IS NOT NULL
GROUP BY t.source_table_full_name
ORDER BY 2 DESC;