用量
view: my_view {
derived_table: {
sql_trigger_value: SELECT CURDATE() ;;
...
}
}
|
階層
sql_trigger_value |
預設值
無
接受
產生一列和一欄的 SQL 陳述式
|
定義
建議改用
datagroup和datagroup_trigger,詳情請參閱「快取查詢」說明文件頁面。
sql_trigger_value 可根據您提供的 SQL 陳述式,觸發永久衍生資料表的重新生成作業。如果 SQL 陳述式的結果與先前的值不同,系統會重新產生 PDT。
sql_trigger_value 參數只會考量您編寫的 SQL 中的第一列和第一欄。因此,我們強烈建議您編寫查詢,只傳回一個值 (一個資料列和一個資料欄)。這樣可避免日後開發人員產生混淆,並防止非串流 SQL 方言將大型結果集載入記憶體。
根據預設,只要沒有其他永久衍生資料表正在建構中,Looker 就會每五分鐘執行您編寫的 SQL 查詢。如果 SQL 查詢的結果有變更,Looker 會重新產生衍生資料表。您可以在 Looker 的管理設定中,使用「PDT 和資料群組維護時間表」設定,視需要變更這項時間表。
舉例來說,假設您執行的是 MySQL,並使用:
sql_trigger_value: SELECT CURDATE() ;;
結果如下:
| sql_trigger_value 執行時間 | sql_trigger_value 結果 |
|---|---|
| 2015-01-01 00:00 | 2015-01-01 |
| 2015-01-01 00:05 | 2015-01-01 |
| 2015-01-01 00:10 | 2015-01-01 |
| ... | ... |
| 2015-01-01 23:55 | 2015-01-01 |
| 2015-01-02 00:00 | 2015-01-02 |
| 2015-01-02 00:05 | 2015-01-02 |
您會發現這項 SQL 查詢的值每天午夜會變更一次,因此衍生資料表會在這些時間重新產生。
Looker 不會對
sql_trigger_value執行時區轉換。如果您使用sql_trigger_value在午夜或一天中的特定時間觸發 PDT 重建,觸發條件會以資料庫設定的時區為準。
如果管理員授予您 develop 權限,您可以在衍生資料表的 sql_trigger_value 查詢變更前,強制重新產生該資料表。執行查詢後,從「探索動作」齒輪選單中選取「重建衍生資料表並執行」選項。
如要進一步瞭解「重建衍生資料表並執行」選項,請參閱「Looker 中的衍生資料表」說明文件頁面。
範例
在 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
| 期望的再生時間表 | 要使用的 SQL |
|---|---|
| 太平洋時間每天午夜 | SELECT FORMAT_TIMESTAMP('%F', CURRENT_TIMESTAMP(), 'America/Los_Angeles') |
| 每天在特定時間一次 | SELECT FLOOR(((TIMESTAMP_DIFF(CURRENT_TIMESTAMP(),'1970-01-01 00:00:00',SECOND)) - 60*60*3)/(60*60*24)) |
| 每天在特定時段發送兩次 | 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 |
| 每天在特定時段放送三次 | 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 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
| 期望的再生時間表 | 要使用的 SQL |
|---|---|
| 每天午夜一次 | SELECT CURDATE() |
| 每天一次,時間為世界標準時間 (UTC) 的特定小時 | SELECT FLOOR((UNIX_TIMESTAMP(NOW()) - 60*60*3)/(60*60*24)) |
| 每天在特定時段發送兩次 | 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 |
| 每天在特定時段放送三次 | 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 |
| 每小時 | SELECT HOUR(CURTIME()) |
| 每 2 小時 (世界標準時間) | SELECT FLOOR(UNIX_TIMESTAMP() / (2*60*60)) |
| 一律不更新資料 | SELECT 1 |
Amazon Redshift
| 期望的再生時間表 | 要使用的 SQL |
|---|---|
| 每天午夜一次 | SELECT CURRENT_DATE |
| 每天在特定時間一次 | SELECT FLOOR((EXTRACT(epoch from GETDATE()) - 60*60*3)/(60*60*24)) |
| 每天在特定時段發送兩次 | 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 |
| 每天在特定時段放送三次 | 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 |
| 每小時 | SELECT DATE_PART('hour', GETDATE()) |
| 每 2 小時 | SELECT FLOOR(EXTRACT(epoch from GETDATE()) / (2*60*60)) |
| 一律不更新資料 | SELECT 1 |
PostgreSQL
| 期望的再生時間表 | 要使用的 SQL |
|---|---|
| 每天午夜一次 | SELECT CURRENT_DATE |
| 每天在特定時間一次 | SELECT FLOOR((EXTRACT(epoch from NOW()) - 60*60*3)/(60*60*24)) |
| 每天在特定時段發送兩次 | 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 |
| 每天在特定時段放送三次 | 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 |
| 每小時 | SELECT DATE_PART('hour', NOW()) |
| 每 2 小時 | SELECT FLOOR(EXTRACT(epoch from NOW()) / (2*60*60)) |
| 一律不更新資料 | SELECT 1 |
Snowflake
| 期望的再生時間表 | 要使用的 SQL |
|---|---|
| 每天午夜一次 | SELECT CURRENT_DATE() |
| 每天一次,時間為世界標準時間 (UTC) 的特定小時 | SELECT FLOOR((DATE_PART('EPOCH_SECOND', CURRENT_TIMESTAMP) - 60*60*3)/(60*60*24)) |
| 每天在特定時段發送兩次 | 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 |
| 每天在特定時段放送三次 | 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 |
| 每小時 | SELECT HOUR(CURRENT_TIME()) |
| 每 2 小時 (世界標準時間) | 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 在開發模式和正式版模式下的運作方式不同
sql_trigger_value 應可在正式版模式中正常運作。在開發模式中,無論您導入的設定為何,所有衍生資料表都會視為已使用 persist_for: 24 hours。詳情請參閱「Looker 中的衍生資料表」說明文件頁面的「開發模式中的持續性資料表」一節。