用途
view: my_view {
derived_table: {
sql_trigger_value: SELECT CURDATE() ;;
...
}
}
|
階層
sql_trigger_value |
デフォルト値
なし
許可
1 行と 1 列の結果を返す SQL ステートメント |
定義
代わりに、クエリのキャッシングのドキュメント ページで説明されている
datagroupとdatagroup_triggerの使用を検討してください。
sql_trigger_value を使用すると、指定した SQL ステートメントに基づいて永続的な派生テーブルの再生成をトリガーできます。SQL文の結果が前の値と異なる場合、PDTが再生成されます。
sql_trigger_value パラメータは、記述した SQL の最初の行と列のみを考慮します。そのため、クエリを記述して 1 つの値(1 つの行と 1 つの列)のみを返すことを強くおすすめします。これにより、将来のデベロッパーの混乱を解消し、ストリーミング以外の SQL 言語が大きな結果セットをメモリに読み込むのを防ぎます。
デフォルトでは、別の永続派生テーブルが構築中の場合を除き、Looker は 5 分ごとに記述した SQL クエリを実行します。SQL クエリの結果が変更されると、Looker は派生テーブルを再生成します。このスケジュールは、Looker の管理設定にある [PDT とデータグループのメンテナンス スケジュール] の設定を使用して、必要に応じて変更できます。
たとえば、MySQL を実行していて、次のコマンドを使用したとします。
sql_trigger_value: SELECT CURDATE() ;;
結果は次のようになります。
| sql_trigger_value の実行時間 | sql_trigger_value の結果 |
|---|---|
| 2015-01-01 00:00 | 2015年1月1日 |
| 2015-01-01 00:05 | 2015年1月1日 |
| 2015-01-01 00:10 | 2015年1月1日 |
| ... | ... |
| 2015-01-01 23:55 | 2015年1月1日 |
| 2015-01-02 00:00 | 2015-01-02 |
| 2015-01-02 00:05 | 2015-01-02 |
この SQL クエリの値は毎日午前 0 時に 1 回変更されるため、派生テーブルはこれらの時間に再生成されます。
Looker では、
sql_trigger_valueのタイムゾーン変換は行われません。sql_trigger_valueを使用して深夜または特定の時刻に PDT の再構築をトリガーすると、トリガーはデータベースが構成されているタイムゾーンで発生します。
管理者が develop 権限を付与している場合は、sql_trigger_value クエリが変更される前に、派生テーブルを強制的に再生成できます。クエリを実行した後、[Explore アクション] の歯車メニューから [派生テーブルの再ビルドと実行] オプションを選択します。
[派生テーブルを再構築して実行する] オプションの詳細については、Looker の派生テーブルのドキュメント ページをご覧ください。
例
毎日午前 0 時に再構築される MySQL に PDT を作成します。
view: clean_events {
derived_table: {
sql:
SELECT *
FROM events
WHERE type NOT IN ('test', 'staff') ;;
sql_trigger_value: SELECT CURDATE() ;;
}
}
次のセクションでは、さまざまな言語でさまざまな PDT 再構築戦略に使用する SQL を示します。
Google BigQuery
| Desired Regeneration Schedule | 使用する SQL |
|---|---|
| 太平洋時間の午前 0 時に 1 日 1 回 | SELECT FORMAT_TIMESTAMP('%F', CURRENT_TIMESTAMP(), 'America/Los_Angeles') |
| 1 日に 1 回(特定の時間) | SELECT FLOOR(((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) - 60*60*3)/(60*60*24)) |
| 1 日 2 回(特定の時間) | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 1 日 3 回、特定の時間帯に | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 1 時間ごと | SELECT EXTRACT(HOUR FROM CURRENT_TIMESTAMP()) |
| 2 時間ごと | SELECT FLOOR((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) / (2*60*60)) |
| データを更新しない | SELECT 1 |
MySQL
| Desired Regeneration Schedule | 使用する SQL |
|---|---|
| 1 日 1 回、午前 0 時 | SELECT CURDATE() |
| 1 日に 1 回、特定の時刻(協定世界時(UTC)) | SELECT FLOOR((UNIX_TIMESTAMP(NOW()) - 60*60*3)/(60*60*24)) |
| 1 日 2 回(特定の時間) | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 1 日 3 回、特定の時間帯に | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 特定のテーブルが更新されたとき | SELECT COUNT(*) FROM table |
| 1 時間ごと | SELECT HOUR(CURTIME()) |
| 2 時間ごと(協定世界時(UTC)) | SELECT FLOOR(UNIX_TIMESTAMP() / (2*60*60)) |
| データを更新しない | SELECT 1 |
Amazon Redshift
| Desired Regeneration Schedule | 使用する SQL |
|---|---|
| 1 日 1 回、午前 0 時 | SELECT CURRENT_DATE |
| 1 日に 1 回(特定の時間) | SELECT FLOOR((EXTRACT(epoch from GETDATE()) - 60*60*3)/(60*60*24)) |
| 1 日 2 回(特定の時間) | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 1 日 3 回、特定の時間帯に | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 特定のテーブルが更新されたとき | SELECT COUNT(*) FROM table |
| 1 時間ごと | SELECT DATE_PART('hour', GETDATE()) |
| 2 時間ごと | SELECT FLOOR(EXTRACT(epoch from GETDATE()) / (2*60*60)) |
| データを更新しない | SELECT 1 |
PostgreSQL
| Desired Regeneration Schedule | 使用する SQL |
|---|---|
| 1 日 1 回、午前 0 時 | SELECT CURRENT_DATE |
| 1 日に 1 回(特定の時間) | SELECT FLOOR((EXTRACT(epoch from NOW()) - 60*60*3)/(60*60*24)) |
| 1 日 2 回(特定の時間) | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 1 日 3 回、特定の時間帯に | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 特定のテーブルが更新されたとき | SELECT COUNT(*) FROM table |
| 1 時間ごと | SELECT DATE_PART('hour', NOW()) |
| 2 時間ごと | SELECT FLOOR(EXTRACT(epoch from NOW()) / (2*60*60)) |
| データを更新しない | SELECT 1 |
Snowflake
| Desired Regeneration Schedule | 使用する SQL |
|---|---|
| 1 日 1 回、午前 0 時 | SELECT CURRENT_DATE() |
| 1 日に 1 回、特定の時刻(協定世界時(UTC)) | SELECT FLOOR((DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) - 60*60*3)/(60*60*24)) |
| 1 日 2 回(特定の時間) | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 4am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 1 日 3 回、特定の時間帯に | SELECT CASE
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 4 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 9
THEN 'between 4am and 9am'
WHEN EXTRACT(HOUR FROM CURRENT_TIMESTAMP) > 9 AND EXTRACT(HOUR FROM CURRENT_TIMESTAMP) < 18
THEN 'between 9am and 6pm'
ELSE 'between 6pm and 4am'
END |
| 特定のテーブルが更新されたとき | SELECT COUNT(*) FROM table |
| 1 時間ごと | SELECT HOUR(CURRENT_TIME()) |
| 2 時間ごと(協定世界時(UTC)) | SELECT FLOOR(DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) / (2*60*60)) |
| データを更新しない | SELECT 1 |
一般的な課題
sql_trigger_value を使用するには、永続的な派生テーブルを設定する必要があります
sql_trigger_value を使用すると、データベース接続設定で派生テーブルの永続性を有効にしていない限り、LookML 検証エラーが発生します。ほとんどのお客様は、データベース接続を最初に構成するときに永続的な派生テーブルを設定します。このルールの最も一般的な例外は、Looker を PostgreSQL の読み取り専用のホットスワップ セカンダリに接続するお客様です。
sql_trigger_value の動作が Development Mode と本番環境モードで異なる
sql_trigger_value は、本番環境モードで想定どおりに動作します。開発モードでは、どのような設定を実装していても、すべての派生テーブルが persist_for: 24 hours を使用しているかのように扱われます。詳しくは、Looker の派生テーブルのドキュメント ページの Development Mode の永続テーブルをご覧ください。