2017-06-19 65 views
4

我試圖從最新表是由形式project_id:dataset:dataset_20160101project_id:dataset:dataset_20160102的BigQuery查詢最新表高效

這個查詢好像是推薦的解決方案的表的數據集高效地查詢:

SELECT * 
FROM `project_id.dataset.*` 
WHERE _TABLE_SUFFIX=(SELECT MAX(table_id) FROM `project_id.dataset.__TABLES_SUMMARY__`) 

然而,這個查詢我開賬單訪問所有表中的數據集,而不只是最新的一個。這是爲什麼?

+0

我有同樣的問題,我認爲這是谷歌方面的錯誤。當我比較使用_TABLE_SUFFIX的硬編碼值運行查詢時,執行時間相同。似乎正在處理相同數量。 – Florent

回答

0

我們只能修剪表時的WHERE子句使用所述僞柱的常量表達式查詢運行之前,例如,_TABLE_SUFFIX =「dataset_20160102」。對於您的查詢,由於WHERE子句包含一個不解析爲常量的子查詢,所以在查詢運行之前,我們不能修剪這些表。而是從所有表中讀取數據並執行子查詢。然後將數據與子查詢結果連接並進行過濾。

這是可能的查詢執行過程中修剪表。開始查詢,執行子查詢,修剪表格並讀取數據。但目前還沒有ETA。

0

現在,如果你有一個管道,其插入表,然後在流水線的末端,你可以 (1)獲得MAX(table_id的) (2)創建具有以下查詢視圖:

SELECT 
     *, 
     DATE max_table_id AS _LATEST_DATE, 
     PARSE_DATE('%E4Y%m%d', _TABLE_SUFFIX) AS _DATA_DATE 
FROM `project_id.dataset.*` 

然後,每當你要查詢的數據,你可以只對查詢視圖,並指定_DATA_DATE = _LATEST_DATE作爲過濾器。在這種情況下,_LATEST_DATE是預先計算的,所以它是不變的。正如華解釋的那樣,您只會處理最新的表格。