本文來自網易雲社區。
最近想來,大數據相關技術與傳統型資料庫技術很多都是相互融合、互相借鑒的。傳統型資料庫強勢在於其久經考驗的SQL優化器經驗,弱勢在於分散式領域的高可用性、容錯性、擴展性等,假以時日,讓其經過一定的改造,比如引入Paxos、raft等,強化自己在分散式領域的能力,相信一定會在大數據系統中佔有一席之地。相反,大數據相關技術優勢在於其天生的擴展性、可用性、容錯性等,但其SQL優化器經驗卻基本全部來自於傳統型資料庫,當然,針對列式存儲大數據SQL優化器會有一定的優化策略。
本文主要介紹SparkSQL的優化器系統Catalyst,上文講到其設計思路基本都來自於傳統型資料庫,而且和大多數當前的大數據SQL處理引擎設計基本相同(Impala、Presto、Hive(Calcite)等),因此通過本文的學習也可以基本了解所有其他SQL處理引擎的工作原理。
SQL優化器核心執行策略主要分為兩個大的方向:基於規則優化(CRO)以及基於代價優化(CBO),基於規則優化是一種經驗式、啟發式地優化思路,更多地依靠前輩總結出來的優化規則,簡單易行且能夠覆蓋到大部分優化邏輯,但是對於核心優化運算元Join卻顯得有點力不從心。舉個簡單的例子,兩個表執行Join到底應該使用BroadcastHashJoin還是SortMergeJoin?當前SparkSQL的方式是通過手工設定參數來確定,如果一個表的數據量小於這個值就使用BroadcastHashJoin,但是這種方案顯得很不優雅,很不靈活。基於代價優化就是為了解決這類問題,它會針對每個Join評估當前兩張表使用每種Join策略的代價,根據代價估算確定一種代價最小的方案。
本文將會重點介紹基於規則的優化策略,後續文章會詳細介紹基於代價的優化策略。下圖中紅色框框部分將是本文的介紹重點: