1. 程式人生 > >hive的JOIN和SQL執行計劃解讀

hive的JOIN和SQL執行計劃解讀

測試資料準備1:

echo -e '1\tzhangsan\n2\tlisi\n3\twangwu'>/tmp/join_a.txt
echo -e '1\t30\n2\t29\n4\t21'>/tmp/join_b.txt

beeline -u "jdbc:hive2://127.0.0.1:10000" -n hadoop -p hadoop
use test1;
create table id_name(
id int, 
name string)
row format delimited fields terminated by '\t';
create table id_age(
id int, 
age int)
row format delimited fields terminated by
'\t'; load data local inpath '/tmp/join_a.txt' overwrite into table id_name; load data local inpath '/tmp/join_b.txt' overwrite into table id_age;

JOIN的幾種SQL:

-- 內連線
select * from id_name join id_age on id_name.id=id_age.id;

-- 外連線
select * from id_name left  join id_age on id_name.id=id_age.id;
select
* from id_name right join id_age on id_name.id=id_age.id;
select * from id_name full join id_age on id_name.id=id_age.id; -- 笛卡爾積 select * from id_name cross join id_age; select * from id_name cross join id_age on id_name.id=id_age.id; select * from id_name cross join id_age where id_name.id=id_age.id;
-- 笛卡爾積基礎上增加連結條件,其實就是內連線

測試資料準備2:

use test1;
create table emp(
empno int, 
ename string, 
job string, 
mgr int, 
hiredate string, 
sal double, 
comm double, 
deptno int)
row format delimited fields terminated by '\t';
create table dept(
deptno int,
dname  string,
loc    string)
row format delimited fields terminated by '\t';
load data local inpath '/tmp/emp' overwrite into table emp;
load data local inpath '/tmp/dept' overwrite into table dept;

hive的join相關分析:

hive常用的join有兩大類:

  • common join/reduce join/shuffle join 一般的join
  • mapjoin 優化器優化後的join

hive預設使用的join:

  • 當 hive.auto.convert.join = true時,優化器預設將common join轉化成mapjoin
  • 當 hive.auto.convert.join = false時,預設使用 common join

測試SQL:

select e.empno, e.ename, e.deptno, d.dname 
  from emp e join dept d on e.deptno=d.deptno;
-- shuffle:將相同的deptno分到一個reduce上去
-- emp表所需列 :<deptno,(empno,ename)>
-- dept表所需列:<deptno,(dname)>
-- 正常的操作如以上分析,分別掃表取出emp表和dept表對應的列
-- 然後將列deptno相同的資料分配到一個reduce上去,查出資料

該SQL的common join執行計劃解讀:

set hive.auto.convert.join = false;
explain
select e.empno, e.ename, e.deptno, d.dname 
  from emp e join dept d on e.deptno=d.deptno;
-- 設定優化器引數為false,使用explain關鍵字檢視執行計劃





可以看出 common join 執行了兩步,第一步是map+reduce,第二部是展示資料,
第一步中,map操作分別對兩表進行掃描,根據deptno分組,查出需要的列資料,傳遞給reduce,
然後在reduce操作中進行join操作,最終得出結果資料集。

該SQL的mapjoin執行計劃解讀:

set hive.auto.convert.join = true;
explain
select e.empno, e.ename, e.deptno, d.dname 
  from emp e join dept d on e.deptno=d.deptno;



可以看出,mapjoin比common join多了一步,首先啟動了一個本地的Map Reduce作業,讀d表,
然後啟動了一個非本地的Map Reduce作業,是一個真實的Map操作,讀e表,
然後並沒有啟動真實的Reduce操作,而直接在Map端進行了join操作,最後展示資料。
使用優化器將commmon join 優化成mapjoin,省掉了Reduce操作,效率更高。

兩種join的進一步分析:


兩表進行common join,需要對兩表分別啟動一組map作業,將資料根據join的條件進行排序,
經過網路shuffle後傳輸到同一個reduce作業,然後啟動該reduce作業,進行join,然後查出資料。
這中join效能是較差的,因為兩表的資料map之後需要經過shuffle進行網路傳輸。


兩表進行mapjoin,首先啟動一個本地的MR Local Task,會去讀小表(根據表的元資料中的統計資訊確定),將小表的資料讀入之後生成一個HashTable檔案,將該檔案存入hadoop的分散式快取中;
然後啟動一個Map任務,將另外一個表的資料讀入之後和上一步存入到入hadoop的分散式快取中的HashTable檔案進行join操作,查出資料。
這種join是沒有shuffle進行網路傳輸的,是效能比較高的join方法。

從hive執行的日誌分析:


第一個紅框看到:啟動一個本地任務,Dump the side-table for tag 生成了hashtable,Uploaded 1 File to 將該hashtable上傳到了分散式快取中;
第二個紅框看到:number of mappers: 1; number of reducers: 0,即一個map操作,沒有reducer操作,map取得資料之後直接和分散式快取中的hashtable進行join,沒有shuffle操作,執行計劃比較高效。

先處理一張表,生成hashtable放入分散式快取,第二張表一遍map一遍和快取做join,不需要shuffle不需要reduce。

[TOC]

相關推薦

hive的JOINSQL執行計劃解讀

測試資料準備1: echo -e '1\tzhangsan\n2\tlisi\n3\twangwu'>/tmp/join_a.txt echo -e '1\t30\n2\t29\n4\t21'>/tmp/join_b.txt beeline -u

mysql sql優化sql執行計劃

mysql 執行計劃SQL優化禁用SELECT *使用SELECT COUNT(*) 統計行數盡量少運算盡量避免全表掃描,如果可以,在過濾列建立索引盡量避免在WHERE子句對字段進行NULL判斷盡量避免在WHERE子句使用!= 或者<>盡量避免在WHERE子句使用OR連接盡量避免對字段進行表達式計

SQL執行計劃解讀

ron 範圍 子查詢 等於 war from 查詢 需要 產生 聲明 5.6中desc看不到show warnings,也看不到filtered列 5.7的desc等於5.6的desc extended,這樣可以看show warnings,5.6中filtered列非常

druid監控每個服務數據庫連接數SQL執行效率

xml文件 dmi authent XML 分享圖片 url col user sta 1、下載druid 2、將剛剛下載的druid放入tomcat下的lib目錄 3、配置要監控的服務啟動文件,添加:-Djava.net.preferIPv4Stack=true -Dco

【轉載】SQL執行計劃

會有 tab serve per nvarchar 消耗cpu 允許 如果 實現 要理解執行計劃,怎麽也得先理解,那各種各樣的名詞吧。鑒於自己還不是很了解。本文打算作為只寫懂的,不懂的懂了才寫。   在開頭要先說明,第一次看執行計劃要註意,SQL Server的執行計劃是從

sql執行計劃

ima dex 表示 OS ron ons merge 掃描 常量 explain + sql語句 返回的type類型有   all   全表掃描(特殊的有limit),type為此類型時,表示該表可以優化   index  全索引掃描   range   對索引列進

一個RDBMS左連接SQL執行計劃解析

red 分析 mys val time keys note sed statement 1、測試數據如下: SQL> select * from t1; a | b | c ---+----+--- 1 | 10 | 1 2 | 20 | 2 3 | 30

Oracle之SQL優化專題02-穩固SQL執行計劃的方法

首先構建一個簡單的測試用例來實際演示: create table emp as select * from scott.emp; create table dept as select * from scott.dept; create index idx_emp_empno on emp(empno);

EXPLAIN檢視SQL執行計劃

參考:《MySQL王者晉級之路》 如有錯誤的地方,請大家一定不吝指出,不勝感激。 還有,不夠全面,以後隨著理解的深入我會不斷加內容的。 我們寫完一個sql語句,為了讓它高效能地執行,一定要explain一下,檢視一下它的執行計劃。 檢視心法: 1.首先從查詢型別type列開始檢視

【MySQL】SQL執行計劃分析

https://blog.csdn.net/da_guo_li/article/details/79008016 執行計劃能告訴我們什麼?     當我們的系統上線後資料庫的記錄不斷增加,之前寫的一些SQL語句或者一些ORM操作效率變得非常低。我們不得不考慮SQ

SQL執行計劃分析

執行計劃能告訴我們什麼? 當我們的系統上線後資料庫的記錄不斷增加,之前寫的一些SQL語句或者一些ORM操作效率變得非常低。我們不得不考慮SQL優化,SQL優化大概是這樣一個流程:1.定位執行效率低的SQL語句(定位),2.分析為什麼這段SQL執行的效率比較低(分析),3.最後根據第二步分析的結構採取優化措施

mysql的sql執行計劃詳解

引言: 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃描表、怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,如千

Oracle之SQL優化專題01-檢視SQL執行計劃的方法

在我2014年總結的“SQL Tuning 基礎概述”中,其實已經介紹了一些檢視SQL執行計劃的方法,但是不夠系統和全面,所以本次SQL優化專題,就首先要系統的介紹一下檢視SQL執行計劃的方法。 本文示例SQL為: --set lines 1000 pages 1000 select a.emp

mysql的sql執行計劃

MySql提供EXPLAIN語法用來進行查詢分析,在SQL語句前加一個“EXPLAIN”,例: EXPLAIN SELECT * FROM T_CLASS WHERE CLASS_NAME="網路工程" 執行結果: 執行結果解釋: select_type:

ORACLE analyse table方式收集表統計資訊導致SQL執行計劃不準確而效能下降

   最近,遇到一客戶,反饋業務響應慢,經過分析後最後鎖定到平時執行不到1秒的SQL語句,今天突然執行時間變成 半分鐘。處理過程如下:     取問題時段的AWR,檢視資料庫負載,發現數據庫負載不高:     檢視資料庫頂級等待事件,發現是檔案離散讀,基本可以鎖定是

MongoDB效能篇 -建立索引,組合索引,唯一索引,刪除索引explain執行計劃

一、索引 MongoDB 提供了多樣性的索引支援,索引資訊被儲存在system.indexes 中,且預設總是為_id建立索引,它的索引使用基本和MySQL 等關係型資料庫一樣。其實可以這樣說說,索引是凌駕於資料儲存系統之上的另一層系統,所以各種結構迥異的儲存都有相同或

Oracle SQL執行計劃基線總結(SQL Plan Baseline)

為了驗證基線中一個處於不可接受狀態的執行計劃是否比一個處於可接受狀態的執行計劃具有更高的效率,必須通過演化來驗證,需要讓優化器以不同的執行計劃來執行這條SQL語句,觀察不可接受狀態的執行計劃基線是否會帶來更好的效能,如果效能確實更高,這個不可接受狀態的基線將會轉換為可接受狀態。演化的方式有兩種:

關於 VS 呼叫儲存過程載入很慢SQL 執行很快的那些事

執行同樣的儲存過程,呼叫同樣的引數 在VS 中呼叫儲存過程和傳參後,到資料載入需要20秒或更多, 在SQL直接呼叫則不到一秒,同一個儲存過程為什麼有這麼大的區別呢? 原因:儲存過程計劃失效的原因 產生原因:儲存過程涉及到的物件表結構發生改變或資料量發生大的變化。 解決方案1:     1、重啟資料

mysql的sql執行計劃詳解(非常有用)

引言: 實際專案開發中,由於我們不知道實際查詢的時候資料庫裡發生了什麼事情,資料庫軟體是怎樣掃描表、怎樣使用索引的,因此,我們能感知到的就只有 sql語句執行的時間,在資料規模不大時,查詢是瞬間的,因此,在寫sql語句的時候就很少考慮到效能的問題。但是當資料規模增大,

MySQL explain執行計劃解讀,索引的建立

本文我們主要介紹了MySQL效能分析以及explain的使用,包括:組合索引、慢查詢分析、MYISAM和INNODB的鎖定、MYSQL的事務配置項等,希望能夠對您有所幫助。 1.使用explain語句去檢視分析結果 如explain select * from test