履歴ベースの最適化を使用する
プレビュー版のサポートについては、bigquery-history-based-optimization-support@google.com までメールでお問い合わせください。
このガイドでは、クエリの履歴ベースの最適化の有効化、無効化、分析を行う方法について説明します。
履歴ベースの最適化について
履歴ベースの最適化では、類似するクエリで完了済みの実行情報に基づいて、追加の最適化を適用し、クエリのパフォーマンス(消費されるスロット時間やクエリ レイテンシなど)を改善します。たとえば、履歴ベースの最適化を適用すると、最初のクエリの実行に 60 秒かかる場合がありますが、履歴ベースの最適化が特定された後の 2 回目のクエリの実行にかかる時間は 30 秒程になります。このプロセスは、追加する最適化がなくなるまで続きます。
以下に、BigQuery で履歴ベースの最適化がどのように機能するかを示します。
実行回数 | クエリスロットの消費時間 | 注 |
---|---|---|
1 | 60 | 元の実行。 |
2 | 30 | 最初に履歴に基づく最適化が適用されます。 |
3 | 20 | 2 回目の履歴ベースの最適化が適用されました。 |
4 | 21 | 適用する追加の履歴ベースの最適化はありません。 |
5 | 19 | 適用する追加の履歴ベースの最適化はありません。 |
6 | 20 | 適用する追加の履歴ベースの最適化はありません。 |
履歴ベースの最適化は、クエリのパフォーマンスに良い影響をもたらすことが高い確率であると判断された場合にのみ適用されます。また、最適化によってクエリのパフォーマンスが大幅に向上しない場合、その最適化は取り消され、今後そのクエリの実行では使用されません。
履歴ベースの最適化を有効にする
プロジェクトで履歴ベースの最適化を使用するには、ALTER PROJECT
ステートメントに default_query_optimizer_options = 'adaptive=on'
パラメータを含めます。
例:
ALTER PROJECT `user_project` SET OPTIONS ( `region-us.default_query_optimizer_options` = 'adaptive=on' );
履歴ベースの最適化を無効にする
プロジェクトで履歴ベースの最適化を無効にするには、ALTER PROJECT
ステートメントに default_query_optimizer_options = 'adaptive=off'
パラメータを含めます。
例:
ALTER PROJECT `user_project` SET OPTIONS ( `region-us.default_query_optimizer_options` = 'adaptive=off' );
ジョブの履歴ベースの最適化を確認する
ジョブの履歴ベースの最適化を確認するには、SQL クエリまたは REST API メソッド呼び出しを使用します。
SQL
クエリを使用して、ジョブの履歴ベースの最適化を取得できます。クエリには、INFORMATION_SCHEMA.JOBS_BY_PROJECT
と query_info.optimization_details
列名を含める必要があります。
次の例では、sample_job
というジョブの最適化の詳細が返されます。履歴ベースの最適化が適用されていない場合、optimization_details
に対して NULL
が生成されます。
SELECT
job_id,
query_info.optimization_details
FROM `project_name.region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE job_id = 'sample_job'
LIMIT 1;
結果は次のようになります。
-- The JSON in optimization_details has been formatted for readability.
/*------------+-----------------------------------------------------------------*
| job_id | optimization_details |
+------------+-----------------------------------------------------------------+
| sample_job | { |
| | "optimizations": [ |
| | { |
| | "semi_join_reduction": "web_sales.web_date,RIGHT" |
| | }, |
| | { |
| | "semi_join_reduction": "catalog_sales.catalog_date,RIGHT" |
| | }, |
| | { |
| | "semi_join_reduction": "store_sales.store_date,RIGHT" |
| | }, |
| | { |
| | "join_commutation": "web_returns.web_item" |
| | }, |
| | { |
| | "parallelism_adjustment": "applied" |
| | }, |
| | ] |
| | } |
*------------+-----------------------------------------------------------------*/
API
ジョブの最適化の詳細を取得するには、jobs.get
メソッドを呼び出します。
次の例では、jobs.get
メソッドが最適化の詳細(optimizationDetails
)を完全なレスポンスで返します。
{
"jobReference": {
"projectId": "myProject",
"jobId": "sample_job"
}
}
結果は次のようになります。
-- The unrelated parts in the full response have been removed.
{
"jobReference": {
"projectId": "myProject",
"jobId": "sample_job",
"location": "US"
},
"statistics": {
"query": {
"queryInfo": {
"optimizationDetails": {
"optimizations": [
{
"semi_join_reduction": "web_sales.web_date,RIGHT"
},
{
"semi_join_reduction": "catalog_sales.catalog_date,RIGHT"
},
{
"semi_join_reduction": "store_sales.store_date,RIGHT"
},
{
"join_commutation": "web_returns.web_item"
},
{
"parallelism_adjustment": "applied"
}
]
}
}
}
}
}
ロールと権限
履歴ベースの最適化を有効にするには、BigQuery のデフォルト構成を作成する権限が必要です。また、
ALTER PROJECT
ステートメントを使用して、履歴ベースの最適化を有効にする必要があります。履歴ベースの最適化を有効にすると、ジョブを作成したユーザーに関係なく、そのプロジェクト内のすべてのジョブで履歴ベースの最適化が使用されます。デフォルト構成に必要な権限について詳しくは、デフォルト構成の必要な権限をご覧ください。履歴ベースの最適化を有効にするには、履歴ベースの最適化を有効にするをご覧ください。INFORMATION_SCHEMA.JOBS
ビューを使用してジョブの履歴ベースの最適化を確認するには、特定のロールが必要です。詳細については、INFORMATION_SCHEMA.JOBS
ビューに必要なロールをご覧ください。