Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 |
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:
- Identifica il record di interesse, quindi copia il
statement_iddel record. - Fare riferimento al record
workspace_idper assicurarsi di essere connessi alla stessa area di lavoro del record. - Fare clic
Cronologia delle query nella barra laterale dell'area di lavoro.
- Nel campo Statement ID incolla
statement_idal record. - Fare clic sul nome di una query. Viene visualizzata una panoramica delle metriche di query.
- 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:
- alert_id: istruzione attivata da un avviso
- sql_query_id: istruzione eseguita dall'interno di questa sessione dell'editor SQL
- dashboard_id: istruzione eseguita da un dashboard
- legacy_dashboard_id: istruzione eseguita da un dashboard legacy
- genie_space_id: istruzione eseguita da uno spazio Spazio Genie
- notebook_id: istruzione eseguita da un notebook
- job_info.job_id: istruzione eseguita all'interno di un processo
- job_info.job_run_id: istruzione eseguita da un'esecuzione di un lavoro
- job_info.job_task_run_id: Istruzione eseguita all'interno di un'esecuzione di un compito lavorativo
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_idelegacy_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_ide unalert_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 nonjob_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;