hive sql的執行計畫相關知識

2021-10-14 13:35:26 字數 1852 閱讀 8761

大部分寫的hivesql,最後基本上都可以落到兩個角度:1.單錶分析:group by+聚合函式,2.多表關聯查詢,區別只是有的業務邏輯簡單一些,有的複雜一些而已:

執行計畫的生成步驟:

其中analyzer會和metainfo進行資訊交換,去做一些關聯查詢校驗的工作:表存不存在,欄位存不存在,字段拼寫是否正確等等,最終校驗完之後生成query block。

謂詞下推和map join都發生在邏輯計畫優化處,也就是logical optimizer。

一般執行計畫會分成三個部分:

獲得sql語句執行計畫的方式:

explain [extended|cbo|ast|dependency|authorization|locks|vectorization|analyze] sql query
使用dependency引數,會返回query sql中所使用的表,會過濾掉臨時表。

使用authorization引數,會返回輸入輸出相關資訊以及當前執行的使用者等資訊。

在 explain 語句中使用extended會產生有關計畫中運算子的額外資訊。通常是物理資訊,如檔名。

hive 查詢將轉換為stage的序列(它更為定向的順迴圈圖形)。乙個stage並不一定是乙個mr,有可能是fetch operator,也有可能是move operator或者是rename operator甚至是和metastore 做互動

乙個mr的執行計畫分為兩個部分:

map operator tree:map端的執行計畫,map端的reduce會出現在這裡,名為reduce output operator。

reduce operator tree:reduce端的執行計畫。

有時候會因為沒有reduce 操作,導致沒有執行計畫沒有reduce operator tree,比如說select * from table_a where pt='xx' and city_name = 'xx市'

一些常見的operator:

tablescan 讀取資料,常見的屬性 alias,後面跟表名,如果表有別名,則顯示別名。

select operator 選取操作

joinoperator 完成join操作的運算元

group by operator 分組聚合, 常見的屬性 aggregations、mode , 當沒有keys屬性時只有乙個分組。

reduce output operator 輸出結果給reduce , 常見的屬性 sort order

fetch operator 客戶端獲取資料 , 常見屬性 limit

常見的屬性的取值及含義:

aggregations(聚合函式) 用在group by operator中,對應取值有:count(),sum()

mode 用在group by operator中,其對應取值分別為:1.hash 用雜湊函式提前聚合;mergepartial 合併之前的聚合結果;final:?;complete:沒有map端提前的聚合,所有操作都在reduce端處理。

如果把hive.map.aggr=false,那將groupby放到reducer才做,它對應的mode是complete.

sort order 用於reduce output operator中

+ 正序排序

』 『(空格) 不排序

++按兩列正序排序,如果有兩列

+- 正反排序,如果有兩列

-反向排序

如此類推

oracle執行計畫相關概念

oracle執行計畫相關概念 1.什麼是執行計畫?為什麼要了解執行計畫?為了執行一條sql語句,oracle可能必須要執行某些步驟的操作,每一步驟可能是從資料庫中物理檢索資料行,或者用某種方法準備資料行,供發出語句的使用者使用。oracle用來執行語句的這些步驟的組合即為執行計畫。執行計畫是sql優...

hive sql檔案的執行方法

1 執行不帶引數的hql檔案 hive f 檔名.字尾 例項 hive f chensq test1.hql 2 執行帶1個普通引數的hql檔案 直接在hive中執行 select count from 使用者名稱.表名 c where c.列名 01 hql檔案內容 select count fr...

oracle 清除相關物件的執行計畫

什麼時候 shared pool 裡面的 shared sql area 被 清除flush 幾種情況 1.相關表 cluster index 等,跟物件相關的,執行過analyze 語句後,oracle會清除原來的快取。2.相關物件被修改過,那麼這個sql area 就變成無效狀態,下一次讀的時候...