天天看點

【SQL 優化器技術系列】 連接配接順序(Join Order)

Oracle 2005 年出了一個 30 多頁的小冊子,《Query Optimization in Oracle Database10g Release 2》,介紹了常見的優化器技術。
我是做 SQL 執行的,優化部分隻了解皮毛,從沒有系統學習過。本系列逐個學習和介紹,自我提升,也幫助他人。

這一節聊連接配接順序。我們不會講怎麼去決策連接配接順序,會講做好連接配接順序的決策有多難:

  • N 表 join 時,表的連接配接順序有 N! 種組合,N=5時,N!= 120
  • 每種 join 可以選擇多種連接配接算法,如 NLJ、HJ、MJ,PWJ 等等
  • 每張表還要決策是否走索引,最多 2^N 種組合

這幾樣算下來,N=5 時大約有

32 * 10 * 120 ~= 3w

種路徑選擇。計算 3w 種組合的代價,代價非常昂貴。

通常來說,5 表 join 實際隻會産生一個非常有限的 access path,詳細多少依賴于各個系統的實作。優化器子產品很大一部分精力就是來優化 access path 計算,這是一個數學上有解但工程上複雜的問題。不過,也沒有什麼黑魔法,動态規劃而已。