[英]Using subquery for _PARTITIONTIME in bigquery does not limit cost
當我使用標准 SQL 在 BQ 上運行以下查詢時,它表示運行時將處理 76.6TB
SELECT
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >(SELECT * FROM `analytics-dwh.autobidding.activity_list` )
AND timestamp_micros(event_time) > (SELECT timestamp_micros(MAX(event_time)) from `essence-analytics-dwh.ml_for_autobidding.nest_na_4q18_activity_updated_daily`)
AND _TABLE_SUFFIX IN ('25','20')
表 analytics-dwh.autobidding.activity_list 只有一列包含唯一的整數列表
如果我從上表中刪除子查詢,查詢在運行時使用不到 500GB
SELECT
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >TIMESTAMP('2018-12-20')
AND timestamp_micros(event_time) > (SELECT timestamp_micros(MAX(event_time)) from `essence-analytics-dwh.ml_for_autobidding.nest_na_4q18_activity_updated_daily`)
AND _TABLE_SUFFIX IN ('25','20')
為什么在我使用子查詢時會發生這種情況? 有解決方法嗎?
為什么使用子查詢會發生這種情況?
通常,當可以在查詢開始時就對過濾器進行評估而無需任何子查詢評估或數據掃描時,分區修剪將減少查詢成本。
您可以了解有關限制使用偽列查詢的分區的更多信息
因此,在您的第一個查詢(使用子查詢的地方)中-修剪沒有發生(它不會根據涉及子查詢的條件來限制分區的使用)
在第二個查詢中,您使用_PARTITIONTIME >TIMESTAMP('2018-12-20')
因此分區受到限制
底線:不能在_PARTITIONTIME上使用包含子查詢的過濾器來限制為分區表掃描的分區數。
有解決方法嗎?
您應該將任務分為兩個步驟:使用表analytics-dwh.autobidding.activity_list
所需的任何邏輯為_PARTITIONTIME計算過濾器,然后使用它(而不是子查詢)-使用您選擇的任何客戶端
通過查看查詢,我假設您要從中選擇MIN或MAX日期:
SELECT * FROM `analytics-dwh.autobidding.activity_list`
並將其傳遞給查詢的第二部分
這可以通過在代碼內使用BigQuery API來完成,該代碼將在兩個步驟之間傳遞值(例如Python或Javascript)
我偶然注意到,如果滿足某些先決條件,BigQuery 現在(從 2022 年中期開始)能夠進行某種動態分區消除。
因此,假設我們要從另一個表計算最大時間戳(就像水印一樣)並將其注入到分區列上的過濾器中。 Tamir Klein 建議分兩步進行,根據有關分區消除的文檔,這就是官方答案。
但是,我發現如果
然后 BigQuery 能夠應用動態分區消除,您將只需要計算水印/子查詢所需的數據量,當然還有分區消除后需要從基表讀取的數據量基於水印。
請注意:結算費用預覽無法反映這一點。 在查詢寫入/預覽時,BQ 優化器只是不知道它需要讀取哪個分區和多少分區,因為子查詢還沒有被評估。 您只能通過查看字節計費指標(當然只有在查詢執行后才可用)才能看到這種效果。
有關更多詳細信息,請在此處查看我的博客條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.