本文包含查詢記錄系統數據表的相關信息,包括數據表架構的大綱。
資料表路徑:此系統資料表位於 system.query.history。
使用查詢記錄數據表
查詢歷程記錄資料表包含使用 SQL 倉儲或無伺服器計算來執行查詢的記錄,這些記錄適用於 筆記本 和 作業。 此資料表包含您存取資料表之相同區域中所有工作區的全帳戶記錄。
根據預設,只有系統管理員可以存取系統數據表。 如果您想要與使用者或群組共用數據表的數據,Databricks 建議為每個使用者或群組建立動態檢視。 請參閱建立動態檢視。
查詢記錄系統數據表架構
查詢歷程記錄資料表會使用下列架構:
| 欄位名稱 | 數據類型 | Description | Example |
|---|---|---|---|
account_id |
字串 | 帳戶的 ID。 | 11e22ba4-87b9-4cc2-9770-d10b894b7118 |
workspace_id |
字串 | 執行查詢之工作區的識別碼。 | 1234567890123456 |
statement_id |
字串 | 可唯一識別該陳述執行過程的 ID。 可以使用此 ID 來查找「查詢歷史」UI 中的陳述執行狀態。 | 7a99b43c-b46c-432b-b0a7-814217701909 |
session_id |
字串 | Spark 工作階段 ID。 | 01234567-cr06-a2mp-t0nd-a14ecfb5a9c2 |
execution_status |
字串 | 陳述式終止狀態。 可能的值為:
|
FINISHED |
compute |
結構 | 結構,表示用來執行語句的計算資源類型,以及適用之資源的標識碼。
type 值爲 WAREHOUSE 或 SERVERLESS_COMPUTE。 |
{type: WAREHOUSE,cluster_id: NULL,warehouse_id: ec58ee3772e8d305} |
executed_by_user_id |
字串 | 執行語句的使用者 ID。 | 2967555311742259 |
executed_by |
字串 | 執行陳述式之使用者的電子郵件地址或使用者名稱。 | example@databricks.com |
statement_text |
字串 | SQL 語句的文本。 如果您已設定客戶自控金鑰,則 statement_text 為空白。 由於記憶體限制,會壓縮較長的語句文字值。 即使壓縮,您也可能達到字元限制。 |
SELECT 1 |
statement_type |
字串 | 陳述式類型。 例如:ALTER、COPY和 INSERT。 |
SELECT |
error_message |
字串 | 描述錯誤狀況的訊息。 如果您已設定客戶自控金鑰,則 error_message 為空白。 |
[INSUFFICIENT_PERMISSIONS] Insufficient privileges: User does not have permission SELECT on table 'default.nyctaxi_trips'. |
client_application |
字串 | 執行語句的用戶端應用程式。 例如:Databricks SQL 編輯器、Tableau 和 Power BI。 此欄位衍生自用戶端應用程式提供的資訊。 雖然值預期會隨著時間保持靜態,但無法保證這一點。 | Databricks SQL Editor |
client_driver |
字串 | 用來連線到 Databricks 以執行 語句的連接器。 例如:Databricks SQL Driver for Go、Databricks ODBC Driver、Databricks JDBC Driver。 | Databricks JDBC Driver |
cache_origin_statement_id |
字串 | 對於從快取擷取的查詢結果,此欄位包含原本將結果插入快取的查詢語句標識符。 如果未從快取擷取查詢結果,此欄位會包含查詢自己的語句標識碼。 | 01f034de-5e17-162d-a176-1f319b12707b |
total_duration_ms |
Bigint | 語句的總運行時間以毫秒為單位(不包括結果擷取時間)。 | 1 |
waiting_for_compute_duration_ms |
Bigint | 等待佈建計算資源所花費的時間 (毫秒)。 | 1 |
waiting_at_capacity_duration_ms |
Bigint | 在佇列中等待可用計算容量所花費的時間 (毫秒)。 | 1 |
execution_duration_ms |
Bigint | 執行陳述式所花費的時間 (毫秒)。 | 1 |
compilation_duration_ms |
Bigint | 載入中繼資料並優化陳述式所花費的時間 (毫秒)。 | 1 |
total_task_duration_ms |
Bigint | 所有任務持續時間的總和 (毫秒)。 此時間代表跨所有節點的所有核心執行查詢所花費的總時間。 如果並行執行多個任務,可能會比掛鐘持續時間長得多。 如果任務等待可用節點,則可能會比掛鐘持續時間短。 | 1 |
result_fetch_duration_ms |
Bigint | 執行完成後擷取陳述式結果所花費的時間 (毫秒)。 | 1 |
start_time |
時間戳記 | Databricks 收到要求的時間。 時區資訊會記錄在值結尾,+00:00 表示 UTC。 |
2022-12-05T00:00:00.000+0000 |
end_time |
時間戳記 | 陳述式執行結束的時間,不包括結果擷取時間。 時區資訊會記錄在值結尾,+00:00 表示 UTC。 |
2022-12-05T00:00:00.000+00:00 |
update_time |
時間戳記 | 陳述上次收到進度更新的時間。 時區資訊會記錄在值結尾,+00:00 表示 UTC。 |
2022-12-05T00:00:00.000+00:00 |
read_partitions |
Bigint | 修剪後讀取分割區的數量。 | 1 |
pruned_files |
Bigint | 剪除的檔案數目。 | 1 |
read_files |
Bigint | 修剪後讀取的檔案數目。 | 1 |
read_rows |
Bigint | 陳述式所讀取的資料列總數。 | 1 |
produced_rows |
Bigint | 陳述式所傳回的資料列總數。 | 1 |
read_bytes |
Bigint | 陳述式讀取的資料總大小為位元組數。 | 1 |
read_io_cache_percent |
int | 從 IO 快取中讀取的持久性數據的位元組百分比。 | 50 |
from_result_cache |
boolean |
TRUE 表示從快取中擷取陳述式結果。 |
TRUE |
spilled_local_bytes |
Bigint | 執行陳述式時暫時寫入磁碟的資料大小 (位元組)。 | 1 |
written_bytes |
Bigint | 寫入雲端物件儲存體之永續性資料的位元組大小。 | 1 |
written_rows |
Bigint | 寫入雲端物件記憶體的持續性數據列數。 | 1 |
written_files |
Bigint | 寫入雲端物件記憶體之永續性數據的檔案數目。 | 1 |
shuffle_read_bytes |
Bigint | 透過網路傳送的資料總量 (位元組)。 | 1 |
query_source |
結構 | 結構體,包含代表參與執行此語句的 Databricks 實體的鍵值對,例如作業、筆記本或儀表板。 此欄位只會記錄 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 |
結構 | 結構,包含參數化查詢中使用的具名和位置參數。 具名參數會以鍵值對表示,將參數名稱對應至值。 位置參數會以清單表示,其中索引會指出參數位置。 一次只能有一種類型(命名或位置)存在。 | {named_parameters: { "param-1": 1, "param-2": "hello"},pos_parameters: null,is_truncated: false} |
executed_as |
字串 | 用來執行陳述式之權限的使用者或服務主體名稱。 | example@databricks.com |
executed_as_user_id |
字串 | 用來執行陳述式之權限的使用者或服務主體識別碼。 | 2967555311742259 |
檢視記錄的查詢概要
若要根據查詢歷史表中的某個記錄導航至查詢設定檔,請執行下列動作:
- 辨識感興趣的記錄,然後複製記錄的
statement_id。 - 參考記錄的
workspace_id,以確保您已登入與記錄相同的工作區。 - 按一下
圖示。在工作區側邊欄中查詢歷程記錄。
- 在[陳述式 ID]欄位中,將記錄中的 貼上。
- 按一下查詢的名稱。 查詢計量的概觀隨即出現。
- 按一下查看查詢設定檔。
瞭解 query_source 欄
query_source 欄包含一組涉及語句執行之 Azure Databricks 實體的唯一識別碼。
如果數據 query_source 行包含多個標識碼,表示語句執行是由多個實體觸發。 例如,作業結果可能會觸發呼叫 SQL 查詢的警示。 在此範例中,這三個識別碼都會填入query_source內。 此數據行的值不會依執行順序排序。
可能的查詢來源如下:
- alert_id:從警示觸發的語句
- sql_query_id:從這個 SQL 編輯器 會話內執行的語句
- dashboard_id:從儀錶板執行的語句
- legacy_dashboard_id:從舊版儀錶板執行的語句
- genie_space_id:從 Genie 空間執行的語句
- notebook_id:從筆記本執行的語句
- job_info.job_id:在作業內執行的語句
- job_info.job_run_id:從作業執行執行的語句
- job_info.job_task_run_id:在作業工作執行內執行的語句
有效的查詢來源組合
下列範例示範如何 query_source 根據查詢的執行方式填入數據行:
作業執行期間執行的查詢包括填入
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}來自舊版儀表板的查詢包括
sql_query_id和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}警示查詢包括
sql_query_id與 :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}來自儀錶板的查詢包括
dashboard_id,但沒有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}
從中繼存放區具體化查詢歷程記錄
下列程式代碼可用來建立每小時、每日或每周執行的作業,以具體化中繼存放區的查詢歷程記錄。 根據需要調整 HISTORY_TABLE_PATH 和 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()
分析資料表熱門程度,包括快取查詢
系統資料表血緣不會提供來自結果快取的查詢結果紀錄。 因此,您必須將查詢歷程表與表格譜系系統表格結合,才能在分析中併入快取的查詢。
例如,下列查詢會擷取過去 7 天內查詢執行時間超過一小時的資料表:
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;