Condividi tramite


Tabella di sistema di riferimento della cronologia delle query

Important

Questa tabella di sistema si trova in versione di anteprima pubblica.

Questo articolo include informazioni sulla tabella di sistema della cronologia delle query, compresa una sintesi dello schema della tabella.

percorso tabella: questa tabella di sistema si trova in system.query.history.

Uso della tabella cronologia query

La tabella della cronologia delle query include i record per le query eseguite utilizzando SQL Warehouses o Serverless Compute per i notebook e i processi . La tabella include record globali dell'account di tutti gli spazi di lavoro nella stessa regione da cui si accede alla tabella.

Per impostazione predefinita, solo gli amministratori hanno accesso alla tabella di sistema. Se si desidera condividere i dati della tabella con un utente o un gruppo, Databricks consiglia di creare una visualizzazione dinamica per ogni utente o gruppo. Vedere Creare una visualizzazione dinamica.

Schema della cronologia delle query nella tabella di sistema

La tabella della cronologia delle query utilizza la seguente struttura:

Nome della colonna Tipo di dati Description Example
account_id string ID dell'account. 11e22ba4-87b9-4cc2
-9770-d10b894b7118
workspace_id string ID dell'area di lavoro in cui è stata eseguita la query. 1234567890123456
statement_id string ID che identifica in modo univoco l'esecuzione dell'istruzione. È possibile usare questo ID per trovare l'esecuzione dell'istruzione nell'interfaccia utente della cronologia query . 7a99b43c-b46c-432b
-b0a7-814217701909
session_id string L'ID sessione Spark. 01234567-cr06-a2mp
-t0nd-a14ecfb5a9c2
execution_status string Stato di terminazione della dichiarazione. I valori possibili sono:
  • FINISHED: l'esecuzione ha avuto esito positivo
  • FAILED: l'esecuzione non è riuscita con il motivo dell'errore descritto nel messaggio di errore associato
  • CANCELED: l'esecuzione è stata annullata
FINISHED
compute struct Una struct che rappresenta il tipo di risorsa di calcolo utilizzata per eseguire il statement e l'ID della risorsa, dove applicabile. Il type valore sarà WAREHOUSE o SERVERLESS_COMPUTE. {
type: WAREHOUSE,
cluster_id: NULL,
warehouse_id: ec58ee3772e8d305
}
executed_by_user_id string ID dell'utente che ha eseguito l'istruzione. 2967555311742259
executed_by string Indirizzo di posta elettronica o nome utente dell'utente che ha eseguito la dichiarazione. example@databricks.com
statement_text string Testo dell'istruzione SQL. Se sono state configurate chiavi gestite dal cliente, statement_text è vuoto. A causa delle limitazioni di archiviazione, i valori di testo delle istruzioni più lunghi vengono compressi. Anche con la compressione, è possibile raggiungere un limite di caratteri. SELECT 1
statement_type string Tipo di dichiarazione. Ad esempio: ALTER, COPYe INSERT. SELECT
error_message string Messaggio che descrive la condizione di errore. Se sono state configurate chiavi gestite dal cliente, error_message è vuoto. [INSUFFICIENT_PERMISSIONS]
Insufficient privileges:
User does not have
permission SELECT on table
'default.nyctaxi_trips'.
client_application string Applicazione client che ha eseguito l'istruzione. Ad esempio: Editor SQL di Databricks, Tableau e Power BI. Questo campo è derivato dalle informazioni fornite dalle applicazioni client. Sebbene i valori rimangano statici nel corso del tempo, questo non può essere garantito. Databricks SQL Editor
client_driver string Connettore usato per connettersi a Databricks per eseguire l'istruzione . Ad esempio: Driver SQL di Databricks per Go, driver ODBC di Databricks, driver JDBC di Databricks. Databricks JDBC Driver
cache_origin_statement_id string Per i risultati della query recuperati dalla cache, questo campo contiene l'ID istruzione della query che originariamente ha inserito il risultato nella cache. Se il risultato della query non viene recuperato dalla cache, questo campo contiene l'ID della dichiarazione della query stessa. 01f034de-5e17-162d
-a176-1f319b12707b
total_duration_ms bigint Tempo di esecuzione totale dell'istruzione in millisecondi (escluso il tempo di recupero dei risultati). 1
waiting_for_compute_duration_ms bigint Tempo impiegato in attesa del provisioning delle risorse di calcolo in millisecondi. 1
waiting_at_capacity_duration_ms bigint Tempo impiegato in attesa in coda per la capacità di calcolo disponibile in millisecondi. 1
execution_duration_ms bigint Tempo impiegato per l'esecuzione dell'istruzione in millisecondi. 1
compilation_duration_ms bigint Tempo impiegato per caricare i metadati e ottimizzare l'istruzione in millisecondi. 1
total_task_duration_ms bigint Somma di tutte le durate dell'attività in millisecondi. Questo tempo rappresenta il tempo combinato impiegato per eseguire la query in tutti i core di tutti i nodi. Può essere significativamente più lungo della durata del tempo a muro se più attività vengono eseguite in parallelo. Può essere più breve della durata del tempo in tempo reale se le attività attendono i nodi disponibili. 1
result_fetch_duration_ms bigint Tempo trascorso, in millisecondi, durante il recupero dei risultati dell'istruzione al termine dell'esecuzione. 1
start_time timestamp Ora in cui Databricks ha ricevuto la richiesta. Le informazioni sul fuso orario vengono registrate alla fine del valore con +00:00 che rappresenta l'ora UTC. 2022-12-05T00:00:00.000+0000
end_time timestamp Ora di termine dell'esecuzione della dichiarazione, escluso il tempo di recupero dei dati. Le informazioni sul fuso orario vengono registrate alla fine del valore con +00:00 che rappresenta l'ora UTC. 2022-12-05T00:00:00.000+00:00
update_time timestamp Ora dell'ultimo aggiornamento del resoconto. Le informazioni sul fuso orario vengono registrate alla fine del valore con +00:00 che rappresenta l'ora UTC. 2022-12-05T00:00:00.000+00:00
read_partitions bigint Numero di partizioni lette dopo la potatura. 1
pruned_files bigint Numero di file eliminati. 1
read_files bigint Numero di file letti dopo la potatura. 1
read_rows bigint Numero totale di righe lette dalla query. 1
produced_rows bigint Numero totale di righe restituite dall'istruzione. 1
read_bytes bigint Dimensione totale dei dati letti dalla dichiarazione in byte. 1
read_io_cache_percent int La percentuale di byte di dati persistenti letti dalla memoria cache di I/O. 50
from_result_cache boolean TRUE indica che il risultato dell'istruzione è stato recuperato dalla cache. TRUE
spilled_local_bytes bigint Dimensioni dei dati, in byte, scritte temporaneamente su disco durante l'esecuzione dell'istruzione. 1
written_bytes bigint Dimensione in byte dei dati persistenti scritti nello storage di oggetti cloud. 1
written_rows bigint Numero di righe di dati persistenti scritti nell'archiviazione di oggetti cloud. 1
written_files bigint Numero di file di dati persistenti scritti nell'archiviazione di oggetti cloud. 1
shuffle_read_bytes bigint Quantità totale di dati in byte inviati in rete. 1
query_source struct Un struct che contiene coppie chiave-valore che rappresentano le entità Databricks coinvolte nella dichiarazione, ad esempio job, notebook o dashboard. Questo campo registra solo le entità di 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 contenente parametri denominati e posizionali usati nelle query parametrizzate. I parametri denominati vengono rappresentati come coppie chiave-valore che eseguono il mapping dei nomi dei parametri ai valori. I parametri posizionali sono rappresentati come un elenco in cui l'indice indica la posizione del parametro. Un solo tipo (denominato o posizionale) può essere presente alla volta. {
named_parameters: {
"param-1": 1,
"param-2": "hello"
},
pos_parameters: null,
is_truncated: false
}
executed_as string Nome dell'utente o dell'entità del servizio il cui privilegio è stato usato per eseguire l'istruzione. example@databricks.com
executed_as_user_id string ID dell'utente o del principale del servizio il cui privilegio è stato utilizzato per eseguire il comando. 2967555311742259

Visualizza il profilo di query per un record

Per passare al profilo di una query basato su un record nella tabella della cronologia delle query, seguire i passaggi seguenti:

  1. Identifica il record di interesse, quindi copia il statement_id del record.
  2. Fare riferimento al record workspace_id per assicurarsi di essere connessi alla stessa area di lavoro del record.
  3. Fare clic sull'icona Cronologia. Cronologia delle query nella barra laterale dell'area di lavoro.
  4. Nel campo Statement ID incolla statement_id al record.
  5. Fare clic sul nome di una query. Viene visualizzata una panoramica delle metriche di query.
  6. Fare clic su Vedere profilo delle query.

Comprendere la colonna query_source

La query_source colonna contiene un set di identificatori univoci delle entità di Azure Databricks coinvolte nell'esecuzione dell'istruzione.

Se la query_source colonna contiene più ID, significa che l'esecuzione dell'istruzione è stata attivata da più entità. Ad esempio, un risultato del lavoro può attivare un avviso che chiama una query SQL. In questo esempio tutti e tre gli ID verranno popolati all'interno di query_source. I valori di questa colonna non vengono ordinati in base all'ordine di esecuzione.

Le possibili origini di query sono:

Combinazioni valide di query_source

Gli esempi seguenti illustrano come la query_source colonna viene popolata a seconda della modalità di esecuzione della query:

  • Le query eseguite durante un'esecuzione di un processo includono una struttura popolata 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
    }

  • Le query dai dashboard legacy includono sql_query_id e 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
    }

  • Le query dagli avvisi includono un sql_query_id e 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
    }

  • Le interrogazioni dai cruscotti includono dashboard_id, ma non 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
    }

Materializzare la cronologia delle query dal metastore

Il codice seguente può essere usato per creare un job programmato su base oraria, giornaliera o settimanale per materializzare la cronologia delle query da un metastore. Regolare di conseguenza le variabili HISTORY_TABLE_PATH e LOOKUP_PERIOD_DAYS.

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

Analizzare la popolarità delle tabelle, incluse le query memorizzate nella cache

La tabella di sistema di derivazione della tabella non genera voci per i risultati della query dalla cache dei risultati. Per questo motivo, è necessario collegare la tabella cronologia query con la tabella di sistema lineage delle tabelle per includere nell'analisi le query memorizzate nella cache.

Ad esempio, la query seguente recupera le tabelle con query che superano un'ora di tempo di esecuzione negli ultimi 7 giorni:

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;