重要
このシステム テーブルは パブリック プレビュー にあります。
この記事には、テーブルのスキーマの概要など、クエリ履歴システム テーブルに関する情報が含まれています。
テーブル パス: このシステム テーブルは、 system.query.history
にあります。
クエリ履歴テーブルの使用
クエリ履歴テーブルには、ノートブックやジョブ用の SQL ウェアハウスまたはサーバーレス コンピューティングを使用して実行されるクエリのレコードが含まれています。 テーブルには、テーブルへのアクセス元である同じリージョン内のすべてのワークスペースのアカウント全体のレコードが含まれています。
既定では、管理者のみがシステム テーブルにアクセスできます。 テーブルのデータをユーザーまたはグループと共有する場合、Databricks では、ユーザーまたはグループごとに動的ビューを作成することをお勧めします。 「動的ビューを作成する」を参照してください。
クエリ履歴システム テーブル スキーマ
クエリ履歴テーブルでは、次のスキーマを使用します。
列名 | データ型 | 説明 | 例 |
---|---|---|---|
account_id |
ひも | アカウントの ID。 | 11e22ba4-87b9-4cc2 -9770-d10b894b7118 |
workspace_id |
ひも | クエリが実行されたワークスペースの ID。 | 1234567890123456 |
statement_id |
ひも | ステートメントの実行を一意に識別する ID。 この ID を使用して、Query History UI でステートメントの実行を見つけることができます。 | 7a99b43c-b46c-432b -b0a7-814217701909 |
session_id |
ひも | Spark セッション ID。 | 01234567-cr06-a2mp -t0nd-a14ecfb5a9c2 |
execution_status |
ひも | ステートメントの終了状態。 次のいずれかの値になります。 - FINISHED : 実行が成功しました- FAILED : 付随するエラー メッセージで説明されているエラーにより実行に失敗しました- CANCELED : 実行が取り消されました |
FINISHED |
compute |
構造体 | ステートメントの実行に使用されたコンピューティング リソースの種類と、該当する場合はリソースの ID を表す構造体。
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 |
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 が要求を受信した時刻。 タイムゾーン情報は、UTC を表す +00:00 という形式で値の末尾に記録されます。 |
2022-12-05T00:00:00.000+0000 |
end_time |
タイムスタンプ(時刻印) | ステートメントの実行が終了した時刻 (結果のフェッチ時間を除く)。 タイムゾーン情報は、UTC を表す +00:00 という形式で値の末尾に記録されます。 |
2022-12-05T00:00:00.000+00:00 |
update_time |
タイムスタンプ(時刻印) | ステートメントが最後に進行状況の更新を受信した時刻。 タイムゾーン情報は、UTC を表す +00:00 という形式で値の末尾に記録されます。 |
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 |
ブーリアン |
TRUE は、ステートメントの結果がキャッシュからフェッチされたことを示します。 |
TRUE |
spilled_local_bytes |
bigint(ビッグイント) | ステートメントの実行中にディスクに一時的に書き込まれたデータのサイズ (バイト単位)。 | 1 |
written_bytes |
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 } |
executed_as |
ひも | ステートメントの実行に使用された権限を持つユーザーまたはサービス プリンシパルの名前。 | example@databricks.com |
executed_as_user_id |
ひも | ステートメントの実行に使用された権限を持つユーザーまたはサービス プリンシパルの ID。 | 2967555311742259 |
レコードのクエリ プロファイルを表示する
クエリ履歴テーブルのレコードに基づいてクエリのクエリ プロファイルに移動するには、次の操作を行います。
- 目的のレコードを特定し、レコードの
statement_id
をコピーします。 - レコードの
workspace_id
を参照して、レコードと同じワークスペースにログインしていることを確認します。 - [
ワークスペースサイドバーのクエリ履歴。
-
[ステートメント ID] フィールドに、レコードの
statement_id
を貼り付けます。 - クエリの名前をクリックします。 クエリ メトリックの概要が表示されます。
- [See query profile] (クエリ プロファイルの表示) をクリックします。
query_source列の理解
query_source
列には、ステートメントの実行に関与する Azure Databricks エンティティの一意の識別子を含むセットが含まれています。
query_source
列に複数の ID が含まれている場合は、ステートメントの実行が複数のエンティティによってトリガーされたことを意味します。 たとえば、ジョブの結果によって、SQL クエリを呼び出すアラートがトリガーされる場合があります。 この例では、3 つの ID はすべて 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の有効な組み合わせ
次の例は、クエリの実行方法に応じて 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()