當BigQuery執行查詢工作時,會將宣告式SQL陳述式轉換成執行圖,圖中會把執行作業拆分成一系列的查詢階段,而這些階段是由更精細的執行步驟組合所組成的。BigQuery會使用大量分散式平行架構來執行這些查詢。階段會模擬許多潛在工作站可能並行執行的工作單元。各階段會透過快速的分散式重組架構通訊。
在查詢計畫中,工作單元和工作站一詞用於傳達並行處理的相關資訊。在BigQuery的其他部分,可能會看到「運算單元」一詞,這是查詢執行作業的多個面向的抽象表示法,包括運算、記憶體和I/O資源。
解讀及最佳化步驟
- READ步:READ步驟表示階段正在存取資料以供處理。可以直接從查詢中參照的資料表,或從Shuffle記憶體中讀取資料。
- COMPUTE步:在COMPUTE步驟中,BigQuery會對資料執行下列動作:
- 評估查詢的SELECT、WHERE、HAVING和其他子句中的運算式,包括計算、比較和邏輯運算。
- 執行內建SQL函式和使用者定義函式。
- 根據查詢中的條件篩選資料列。
- WRITE步:WRITE步驟會針對中繼資料和最終輸出結果執行。寫入Shuffle記憶體:在多階段查詢中,WRITE步驟通常會將已處理的資料傳送至另一個階段,以便進一步處理。這通常是亂數記憶體的情況,因為亂數記憶體會結合或匯總來自多個來源的資料。這個階段寫入的資料通常是暫時結果,而非最終輸出內容。或者,最終輸出內容:查詢結果會寫入目的地或暫時性資料表。
- JOIN步:在JOIN步驟中,BigQuery會結合兩個資料來源的資料。
- AGGREGATE步:在AGGREGATE步驟中,BigQuery會匯總及分組資料。
- REPARTITION步:REPARTITION和COALESCE都是BigQuery直接套用至查詢中隨機排序資料的最佳化技巧。
- REPARTITION:此運算旨在重新平衡各工作節點的資料分布情形。假設在重新排序後,一個worker節點會產生不成比例的大量資料。REPARTITION步驟會更平均地重新分配資料,避免任何單一工作站成為瓶頸。這對於需要大量運算的作業(例如彙整)尤其重要。
- COALESCE:如果在洗牌後有許多小資料區塊,就會執行這個步驟。COALESCE步驟會將這些桶合併為較大的桶,藉此減少管理大量小型資料的額外負擔。在處理非常小的中間結果集時,這項功能尤其實用。
- 如果查詢計畫中顯示REPARTITION或COALESCE步驟,不一定表示查詢有問題。這通常表示BigQuery正在主動最佳化資料分發作業,以提升效能。不過,如果您屢次看到這些作業,可能表示資料本身有偏差,或是查詢導致過度重複排序資料。
聯合查詢說明
聯合查詢可使用EXTERNAL_QUERY函式,將查詢陳述式傳送至外部資料來源。聯合查詢會採用稱為SQL推送的最佳化技術。這些函式會將篩選等作業委派給外部資料來源,而非在BigQuery中執行,藉此提升查詢效能。API 表示法範例
查詢計劃資訊會內嵌於工作回應資訊,可以呼叫 jobs.get 擷取該資訊。
HTTP request
GET https://bigquery.googleapis.com/bigquery/v2/projects/{projectId}/jobs/{jobId}
The URL uses gRPC Transcoding syntax.