Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 |
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 :
- Identifiez l’enregistrement souhaité, puis copiez l’enregistrement
statement_id. - Référez-vous à l'enregistrement
workspace_idpour vous assurer que vous êtes connecté au même espace de travail que cet enregistrement. - Cliquez sur
Historique des requêtes dans la barre latérale de l’espace de travail.
- Dans le champ ID d’instruction, collez le
statement_idsur l’enregistrement. - Cliquez sur le nom d’une requête. Une vue d’ensemble des mesures de requête s’affiche.
- 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_inforempli.{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_idet unlegacy_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_idetalert_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 pasjob_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;