Partager via


Référence sur la table système de l’historique des requêtes

Important

Cette table système est en préversion publique.

Cet article contient des informations sur la table système de l’historique des requêtes, y compris un plan du schéma de la table.

Chemin d’accès de la table : cette table système se trouve à l’emplacement system.query.history.

Utilisation de la table de l’historique des requêtes

La table de l’historique des requêtes inclut les enregistrements des requêtes exécutées à l’aide d’entrepôts SQL ou de calcul serverless pour des notebooks et des tâches. La table inclut des enregistrements à l’échelle du compte de tous les espaces de travail de la région à partir de laquelle vous accédez à la table.

Par défaut, seuls les administrateurs ont accès à la table système. Si vous souhaitez partager les données de la table avec un utilisateur ou un groupe, Databricks recommande de créer une vue dynamique pour chaque utilisateur ou groupe. Consultez Créer une vue dynamique.

Schéma de la table système de l’historique des requêtes

La table d’historique des requêtes utilise le schéma suivant :

Nom de colonne Type de données Description Example
account_id string ID du compte. 11e22ba4-87b9-4cc2
-9770-d10b894b7118
workspace_id string ID de l’espace de travail où la requête a été exécutée. 1234567890123456
statement_id string ID qui identifie de façon unique l’exécution de l’instruction. Vous pouvez utiliser cet ID pour rechercher l’exécution de l’instruction dans l’interface utilisateur de l’historique des requêtes. 7a99b43c-b46c-432b
-b0a7-814217701909
session_id string ID de session Spark. 01234567-cr06-a2mp
-t0nd-a14ecfb5a9c2
execution_status string État d’arrêt de l’instruction. Les valeurs possibles sont les suivantes :
  • FINISHED: l’exécution a réussi
  • FAILED: échec de l’exécution avec la raison de l’échec décrit dans le message d’erreur associé
  • CANCELED: l’exécution a été annulée
FINISHED
compute struct Struct qui représente le type de ressource de calcul utilisé pour exécuter l’instruction et l’ID de la ressource, le cas échéant. La valeur type est WAREHOUSE ou SERVERLESS_COMPUTE. {
type: WAREHOUSE,
cluster_id: NULL,
warehouse_id: ec58ee3772e8d305
}
executed_by_user_id string ID de l’utilisateur qui a exécuté l’instruction. 2967555311742259
executed_by string Adresse e-mail ou nom d’utilisateur de l’utilisateur qui a exécuté l’instruction. example@databricks.com
statement_text string Texte de l’instruction SQL. Si vous avez configuré des clés gérées par le client, statement_text est vide. En raison des limitations de stockage, les valeurs de texte d’instruction plus longues sont compressées. Même avec la compression, vous pouvez atteindre une limite de caractères. SELECT 1
statement_type string Type de déclaration Par exemple : ALTER, COPY et INSERT. SELECT
error_message string Message décrivant la condition de l’erreur. Si vous avez configuré des clés gérées par le client, error_message est vide. [INSUFFICIENT_PERMISSIONS]
Insufficient privileges:
User does not have
permission SELECT on table
'default.nyctaxi_trips'.
client_application string Application cliente qui a exécuté l’instruction. Par exemple : Éditeur SQL Databricks, Tableau et Power BI. Ce champ est dérivé des informations fournies par les applications clientes. Bien que les valeurs restent statiques au fil du temps, cela ne peut pas être garanti. Databricks SQL Editor
client_driver string Connecteur utilisé pour se connecter à Databricks pour exécuter l’instruction. Par exemple : Pilote Databricks SQL pour Go, Pilote Databricks ODBC, Pilote Databricks JDBC. Databricks JDBC Driver
cache_origin_statement_id string Pour les résultats de requête extraits du cache, ce champ contient l’ID d’instruction de la requête qui a initialement inséré le résultat dans le cache. Si le résultat de la requête n’est pas extrait du cache, ce champ contient l’ID d’instruction de la requête. 01f034de-5e17-162d
-a176-1f319b12707b
total_duration_ms bigint Durée d’exécution totale de l’instruction en millisecondes (à l’exception du temps d’extraction des résultats). 1
waiting_for_compute_duration_ms bigint Temps passé à attendre que les ressources de calcul soient approvisionnées en millisecondes. 1
waiting_at_capacity_duration_ms bigint Temps passé à attendre dans la file d’attente une capacité de calcul disponible en millisecondes. 1
execution_duration_ms bigint Temps passé à exécuter l’instruction en millisecondes. 1
compilation_duration_ms bigint Temps passé à charger les métadonnées et à optimiser la requête en millisecondes. 1
total_task_duration_ms bigint Somme de toutes les durées des tâches en millisecondes. Cette durée représente le temps combiné qu’il a fallu pour exécuter la requête sur tous les cœurs de tous les nœuds. Elle peut être beaucoup plus longue que la durée horloge si plusieurs tâches sont exécutées en parallèle. Elle peut être plus courte que la durée horloge si les tâches attendent des nœuds disponibles. 1
result_fetch_duration_ms bigint Temps passé, en millisecondes, à extraire les résultats de l’instruction une fois l’exécution terminée. 1
start_time timestamp Heure à laquelle Databricks a reçu la demande. Les informations sur le fuseau horaire sont enregistrées à la fin de la valeur, où +00:00 représente le fuseau horaire UTC. 2022-12-05T00:00:00.000+0000
end_time timestamp Heure de fin de l’exécution de l’instruction, durée d’extraction des résultats non comprise. Les informations sur le fuseau horaire sont enregistrées à la fin de la valeur, où +00:00 représente le fuseau horaire UTC. 2022-12-05T00:00:00.000+00:00
update_time timestamp Heure à laquelle l’instruction a reçu une mise à jour de progression pour la dernière fois. Les informations sur le fuseau horaire sont enregistrées à la fin de la valeur, où +00:00 représente le fuseau horaire UTC. 2022-12-05T00:00:00.000+00:00
read_partitions bigint Nombre de partitions lues après le nettoyage. 1
pruned_files bigint Nombre de fichiers nettoyés. 1
read_files bigint Nombre de fichiers lus après le nettoyage. 1
read_rows bigint Nombre total de lignes lues par l’instruction. 1
produced_rows bigint Nombre total de lignes retournées par l’instruction. 1
read_bytes bigint Taille totale des données lues par l’instruction en octets. 1
read_io_cache_percent int Pourcentage d’octets des données persistantes lues à partir du cache d’E/S. 50
from_result_cache boolean TRUE indique que le résultat de l’instruction a été extrait du cache. TRUE
spilled_local_bytes bigint Taille en octets des données provisoirement écrites sur le disque lors de l’exécution de l’instruction. 1
written_bytes bigint Taille en octets des données persistantes écrites dans le stockage d’objets cloud. 1
written_rows bigint Nombre de lignes de données persistantes écrites dans le stockage d’objets cloud. 1
written_files bigint Nombre de fichiers de données persistantes écrites dans le stockage d’objets cloud. 1
shuffle_read_bytes bigint Quantité totale en octets des données envoyées sur le réseau. 1
query_source struct Une structure qui contient des paires clé-valeur représentant des entités Databricks impliquées dans l'exécution de cette instruction, telles que des tâches, des notebooks ou des tableaux de bord. Ce champ enregistre uniquement des entités 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 struct contenant des paramètres nommés et positionnels utilisés dans les requêtes paramétrées. Les paramètres nommés sont représentés en tant que paires clé-valeur mappant les noms de paramètres aux valeurs. Les paramètres positionnels sont représentés sous la forme d’une liste où l’index indique la position des paramètres. Un seul type (nommé ou positionnel) peut être présent à la fois. {
named_parameters: {
"param-1": 1,
"param-2": "hello"
},
pos_parameters: null,
is_truncated: false
}
executed_as string Nom de l’utilisateur ou principal de service dont le privilège a été utilisé pour exécuter l’instruction. example@databricks.com
executed_as_user_id string L'ID de l’utilisateur ou du responsable de service dont le privilège a été utilisé pour exécuter l’instruction. 2967555311742259

Afficher le profil de requête d’un enregistrement

Pour accéder au profil de requête d’une requête en fonction d’un enregistrement dans la table d’historique des requêtes, procédez comme suit :

  1. Identifiez l’enregistrement souhaité, puis copiez l’enregistrement statement_id.
  2. Référez-vous à l'enregistrement workspace_id pour vous assurer que vous êtes connecté au même espace de travail que cet enregistrement.
  3. Cliquez sur l’icône Historique.Historique des requêtes dans la barre latérale de l’espace de travail.
  4. Dans le champ ID d’instruction, collez le statement_id sur l’enregistrement.
  5. Cliquez sur le nom d’une requête. Une vue d’ensemble des mesures de requête s’affiche.
  6. Cliquez sur Afficher le profil de requête.

Compréhension de la colonne query_source

La query_source colonne contient un ensemble d’identificateurs uniques d’entités Azure Databricks impliquées dans l’exécution de l’instruction.

Si la query_source colonne contient plusieurs ID, cela signifie que l’exécution de l’instruction a été déclenchée par plusieurs entités. Par exemple, un résultat de travail peut déclencher une alerte qui appelle une requête SQL. Dans cet exemple, les trois ID seront renseignés dans query_source. Les valeurs de cette colonne ne sont pas triées par ordre d’exécution.

Les sources de requête possibles sont les suivantes :

  • alert_id : instruction déclenchée à partir d’une alerte
  • sql_query_id : instruction exécutée à partir de cette session d’éditeur SQL
  • dashboard_id : instruction exécutée à partir d’un tableau de bord
  • legacy_dashboard_id : instruction exécutée à partir d’un tableau de bord hérité
  • genie_space_id : instruction exécutée à partir d’un espace Génie
  • notebook_id : instruction exécutée à partir d’un notebook
  • job_info.job_id : instruction exécutée dans un travail
  • job_info.job_run_id : instruction exécutée à partir d’une exécution de tâche
  • job_info.job_task_run_id : instruction exécutée dans une tâche de travail

Combinaisons valides de query_source

Les exemples suivants montrent comment la query_source colonne est remplie en fonction de la façon dont la requête est exécutée :

  • Les requêtes exécutées au cours d'une exécution de tâche incluent un struct job_info rempli.

    {
    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
    }

  • Les requêtes provenant de tableaux de bord hérités incluent un sql_query_id et 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
    }

  • Les requêtes provenant d’alertes incluent un sql_query_id et 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
    }

  • Les requêtes à partir de tableaux de bord incluent un dashboard_id, mais pas 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
    }

Matérialiser l’historique des requêtes à partir de votre metastore

Le code suivant peut être utilisé pour créer un travail s’exécutant toutes les heures, tous les jours ou chaque semaine pour matérialiser l’historique des requêtes à partir d’un metastore. Ajustez les variables HISTORY_TABLE_PATH et LOOKUP_PERIOD_DAYS en conséquence.

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()

Analyser la popularité des tables, y compris les requêtes mises en cache

La table du système de lignage de table n’émet pas d’entrées pour les résultats de requête provenant du cache de résultats. En raison de cela, vous devez joindre la table d’historique des requêtes à la table système de traçabilité de table pour inclure des requêtes mises en cache dans votre analyse.

Par exemple, la requête suivante récupère les tables avec des requêtes dépassant une heure d’exécution au cours des 7 derniers jours :

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;