查詢分群資料表
在 BigQuery 查詢分群資料表時,篩選分群資料欄可提升效能並降低成本。當查詢篩選一或多個分群資料欄時,BigQuery 會使用分群資訊,只掃描相關區塊,這個程序稱為「區塊剪除」。
本文說明查詢分群資料表的權限和最佳做法,包括篩選器中分群資料欄順序的重要性。您只能使用 GoogleSQL 查詢分群資料表。
所需權限
如要執行查詢工作,您必須具備執行查詢工作的專案 bigquery.jobs.create Identity and Access Management (IAM) 權限。
下列各項預先定義的 IAM 角色,都包含執行查詢工作所需的權限:
roles/bigquery.adminroles/bigquery.jobUserroles/bigquery.user
此外,您也必須具備查詢參照的所有資料表和檢視表的 bigquery.tables.getData 權限。此外,查詢檢視表時,您必須具備所有基礎資料表和檢視表的這項權限。不過,如果您使用授權檢視表或授權資料集,則不需要基礎來源資料的存取權。
下列各項預先定義的 IAM 角色,都包含查詢參照的所有資料表和檢視表所需權限:
roles/bigquery.adminroles/bigquery.dataOwnerroles/bigquery.dataEditorroles/bigquery.dataViewer
如要進一步瞭解 BigQuery 的 IAM 角色,請參閱「預先定義的角色和權限」。
查詢分群資料表
您可以透過下列方式查詢分群資料表:
- 使用 Google Cloud 控制台
- 在 bq 指令列工具中使用
bq query指令 - 呼叫
jobs.insert方法並設定查詢工作 - 使用用戶端程式庫
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
最佳做法
如要讓分群資料表的查詢發揮最佳效能,請採用下列最佳做法。
為提供背景資訊,最佳做法範例中使用的範例資料表,是使用 DDL 陳述式建立的分群資料表。DDL 陳述式會建立名為 ClusteredSalesData 的資料表。資料表會依下列資料欄分群:customer_id、product_id、order_id,並依此順序排序。
CREATE TABLE `mydataset.ClusteredSalesData` PARTITION BY DATE(timestamp) CLUSTER BY customer_id, product_id, order_id AS SELECT * FROM `mydataset.SalesData`
依排列順序篩選分群欄
指定篩選條件時,請使用依排列順序篩選分群資料欄的運算式。排序順序是 CLUSTER BY 子句中指定的資料欄順序。如要享有叢集的好處,請按照由左至右的排列順序,加入一或多個叢集資料欄,從第一個資料欄開始。在多數情況下,第一個叢集資料欄在區塊剪除中最有效,其次是第二個資料欄,第三個資料欄則最不有效。您仍可在查詢中單獨使用第二或第三欄,但區塊剪除的效果可能不佳。篩選運算式中的資料欄名稱順序不會影響效能。
下列範例會查詢在上述範例中建立的 ClusteredSalesData 分群資料表。查詢包含篩選運算式,會先篩選 customer_id,再篩選 product_id。這項查詢會按照排序順序 (CLUSTER BY 子句中指定的資料欄順序) 篩選分群資料欄,藉此提升效能。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000 AND product_id LIKE 'gcp_analytics%'
下列查詢不會依排列順序篩選分群資料欄。因此無法達到最佳查詢效能。這項查詢先依 product_id 進行篩選,再依 order_id 進行篩選 (略過 customer_id)。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE product_id LIKE 'gcp_analytics%' AND order_id = 20000
請勿在複雜的篩選運算式中使用叢集資料欄
如果在複合篩選運算式中使用叢集資料欄,就無法套用區塊修剪,從而無法達到最佳查詢效能。
舉例來說,下列查詢不會修剪區塊,因為篩選運算式的函式中使用了分群欄 customer_id。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE CAST(customer_id AS STRING) = "10000"
如要修剪區塊以達到最佳查詢效能,請使用如下所示的簡易篩選運算式。在這個範例中,我們對叢集資料欄 customer_id 套用簡單的篩選器。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000
請勿將分群長條圖與其他資料欄進行比較
如果篩選運算式把叢集資料欄跟另一個資料欄 (叢集資料欄或非叢集資料欄) 進行比對,就無法套用區塊修剪,因此無法達到最佳查詢效能。
下列查詢不會剪除區塊,因為篩選運算式會比較分群資料欄 customer_id 和另一個資料欄 order_id。
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = order_id
資料表安全性
如要控管 BigQuery 資料表的存取權,請參閱「使用 IAM 控管資源存取權」。
後續步驟
- 如需執行查詢的詳細資訊,請參閱執行互動式與批次查詢一文。
- 如要瞭解如何建立及使用分群資料表,請參閱「建立及使用分群資料表」。
- 如需 BigQuery 中的分區資料表支援總覽,請參閱分區資料表簡介一文。
- 如要瞭解如何建立分區資料表,請參閱「建立分區資料表」。