最佳化查詢效能簡介
本文件將概略說明可改善 BigQuery 查詢效能的最佳化技巧。一般來說,查詢時需要完成的工作越少,成效就會越好。執行速度更快,耗用資源更少,因此可降低成本和失敗次數。
查詢效能
評估 BigQuery 中的查詢效能時,需要考量以下幾個因素:
- 輸入資料和資料來源 (I/O):查詢作業會讀取多少位元組數?
- (隨機排列) 節點間的通訊:查詢作業會傳送多少位元組數到下一個階段?查詢作業會傳送多少位元組數到每一個運算單元?
- 計算:查詢需要使用多少 CPU 工作負載?
- 輸出 (實質關聯性):查詢作業會寫入多少位元組數?
- 容量和並行:同時可用的運算單元數量和正在執行的其他查詢數量為何?
- 查詢模式:查詢是否遵循 SQL 最佳做法?
如要評估特定查詢或瞭解是否發生資源競爭情形,您可以使用 Cloud Monitoring 或 BigQuery 管理資源圖表,監控 BigQuery 工作在一段時間內的資源使用情形。如發現有速度緩慢或資源密集型的查詢,可以將效能最佳化集中在該查詢上。
您可以使用 BigQuery BI Engine 加快某些查詢模式的速度,尤其是由商業智慧工具產生的查詢模式。BI Engine 是速度飛快的記憶體內分析服務,可透過智慧快取您最常用到的資料,加速 BigQuery 中的許多 SQL 查詢。BI Engine 已內建於 BigQuery,因此您通常不必修改查詢就能獲得更佳的效能。
與任何系統一樣,最佳化效能有時也需要進行取捨。 舉例來說,對非 SQL 專家的人而言,使用進階 SQL 語法有時可能會增加複雜性,並降低他們對查詢的理解。 將時間花費在對非關鍵工作負載進行微最佳化,也可能占用可用在為應用程式建構新功能或找出更重要最佳化項目的資源。為協助您獲得最高投資報酬率,我們建議您將最佳化心力集中在對資料分析管道最重要的工作負載上。
針對容量和並行性進行最佳化
BigQuery 針對查詢提供了兩種計費模式:以量計價與以容量計價。以量計價模式提供共用容量資源池,價格則取決於您執行的每個查詢所處理的資料量。
如果您想編列一致的每月支出預算,或是需要的容量超過以量計價模式可用的容量,建議您採用容量計價模式。採用以運算資源為基礎的計價方案時,您會分配以運算單元為計算單位的查詢處理作業專用容量。系統處理所有位元組所產生的費用都會包含在容量定價中。除了固定的運算單元承諾,您還可以使用自動調度運算單元,這項功能會根據查詢工作負載提供動態容量。
在相同資料上重複執行的查詢效能可能會有所不同,而且使用隨選運算單元的查詢通常會比使用預留運算單元的查詢有更大的變化。
在 SQL 查詢處理期間,BigQuery 會將執行查詢各個階段所需的運算能力細分為運算單元。BigQuery 會自動決定可同時執行的查詢數量,如下所示:
- 以量計價模型:專案中可用的運算單元數
- 容量型模型:預留項目的可用運算單元數量
如果查詢要求的運算單元數量高於目前可用的數量,BigQuery 就會將查詢排入佇列,直到處理資源可供使用為止。查詢開始執行後,BigQuery 會根據階段大小和複雜度,以及可用的運算單元數量,計算每個查詢階段使用的運算單元數量。BigQuery 會使用稱為「公平排程」的技術,確保每個查詢都有足夠的處理能力。
使用更多運算單元,並不保證查詢效能一定會提升。但若運算單元集區較大,也許可以為大型或非常複雜的查詢提升效能,也能提升高度並行工作負載的效能。如要改善查詢效能,您可以修改時段預留,或為時段自動調度設定更高的限制。
查詢計畫與時程
每次執行查詢時,BigQuery 都會產生查詢計畫。如要有效地最佳化查詢,就必須瞭解這個計畫。查詢計畫包含執行統計資料,例如讀取位元組數和用到的時段時間。查詢計畫也包含執行作業的各個階段詳細資料,可協助您診斷及改善查詢效能。查詢執行圖提供圖形介面,方便您查看查詢計畫及診斷查詢效能問題。
您也可以使用 jobs.get
API 方法或 INFORMATION_SCHEMA.JOBS
檢視畫面來擷取查詢計畫和時程資訊。BigQuery Visualiser 會使用這項資訊。BigQuery Visualiser 是一個開放原始碼工具,能以視覺方式呈現 BigQuery 工作中的執行階段流程。
BigQuery 執行查詢工作時,會將 SQL 宣告陳述式轉換成執行圖。這個圖會再細分成一連串的查詢階段,而這些階段本身是由更精細的執行步驟集所組成。BigQuery 使用大量分散式平行架構來執行這些查詢。BigQuery 的階段則是模擬許多潛在工作站可能平行執行的工作單元。各階段之間是使用快速的分散式重組基礎架構通訊。
除了查詢計畫外,查詢工作也會顯示執行時程。 時程會顯示查詢工作站已完成、待處理和作用中工作單位的計算。查詢可以同時有多個作用中工作站,各在不同的階段,因此時程主要是用來顯示查詢的整體進度。
如要估算查詢在運算方面的費用有多高,可查看查詢使用的總運算單元秒數。運算單元秒數越低越好,因為這表示有更多資源可供同一專案中同時執行的其他查詢使用。
查詢計畫和時程統計資料可協助您瞭解 BigQuery 執行查詢的方式,以及是否有特定階段霸占資源使用量。例如,JOIN
階段產生的輸出資料列比輸入資料列多很多,可能表示可以在查詢中更早進行篩選。
然而,服務的代管性質限制了部分詳細資料是否可以直接操作。如要瞭解改善查詢執行作業和效能的最佳做法和技巧,請參閱「最佳化查詢運算」。
後續步驟
- 瞭解如何使用 BigQuery 稽核記錄排解查詢執行問題。
- 瞭解其他 BigQuery 費用控管技巧。
- 使用
INFORMATION_SHEMA.JOBS
檢視畫面查看 BigQuery 工作近乎即時的中繼資料。 - 瞭解如何使用 BigQuery 系統表報表監控 BigQuery 用量。