91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何通過explain來驗證sql的執行順序

Linux愛好者 ? 來源:五分鐘學大數據 ? 作者:園陌 ? 2021-09-07 16:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關于 sql 語句的執行順序網上有很多資料,但是大多都沒進行驗證,并且很多都有點小錯誤,尤其是對于 select 和 group by 執行的先后順序,有說 select 先執行,有說 group by 先執行,到底它倆誰先執行呢?

今天我們通過 explain 來驗證下 sql 的執行順序。

在驗證之前,先說結論,Hive 中 sql 語句的執行順序如下:

from 。. where 。. join 。. on 。. select 。. group by 。. select 。. having 。. distinct 。. order by 。. limit 。. union/union all

可以看到 group by 是在兩個 select 之間,我們知道 Hive 是默認開啟 map 端的 group by 分組的,所以在 map 端是 select 先執行,在 reduce 端是 group by先執行。

下面我們通過一個 sql 語句分析下:

select

sum(b.order_amount) sum_amount,

count(a.userkey) count_user

from user_info a

left join user_order b

on a.idno=b.idno

where a.idno 》 ‘112233’group by a.idno

having count_user》1limit 10;

上面這條 sql 語句是可以成功執行的,我們看下它在 MR 中的執行順序:

Map 階段:

執行 from,進行表的查找與加載;

執行 where,注意:sql 語句中 left join 寫在 where 之前的,但是實際執行先執行 where 操作,因為 Hive 會對語句進行優化,如果符合謂詞下推規則,將進行謂詞下推;

執行 left join 操作,按照 key 進行表的關聯;

執行輸出列的操作,注意: select 后面只有兩個字段(order_amount,userkey),此時 Hive 是否只輸出這兩個字段呢,當然不是,因為 group by 的是 idno,如果只輸出 select 的兩個字段,后面 group by 將沒有辦法對 idno 進行分組,所以此時輸出的字段有三個:idno,order_amount,userkey;

執行 map 端的 group by,此時的分組方式采用的是哈希分組,按照 idno 分組,進行order_amount 的 sum 操作和 userkey 的 count 操作,最后按照 idno 進行排序(group by 默認會附帶排序操作);

Reduce 階段:

執行 reduce 端的 group by,此時的分組方式采用的是合并分組,對 map 端發來的數據按照 idno 進行分組合并,同時進行聚合操作 sum(order_amount)和 count(userkey);

執行 select,此時輸出的就只有 select 的兩個字段:sum(order_amount) as sum_amount,count(userkey) as count_user;

執行 having,此時才開始執行 group by 后的 having 操作,對 count_user 進行過濾,注意:因為上一步輸出的只有 select 的兩個字段了,所以 having 的過濾字段只能是這兩個字段;

執行 limit,限制輸出的行數為 10。

上面這個執行順序到底對不對呢,我們可以通過 explain 執行計劃來看下,內容過多,我們分階段來看。

首先看下 sql 語句的執行依賴:

b87621aa-0fb2-11ec-8fb8-12bb97331649.png

我們看到 Stage-5 是根,也就是最先執行 Stage-5,Stage-2 依賴 Stage-5,Stage-0 依賴 Stage-2。

首先執行 Stage-5:

b883ad3e-0fb2-11ec-8fb8-12bb97331649.png

圖中標 ① 處是表掃描操作,注意先掃描的 b 表,也就是 left join 后面的表,然后進行過濾操作(圖中標 ② 處),我們 sql 語句中是對 a 表進行的過濾,但是 Hive 也會自動對 b 表進行相同的過濾操作,這樣可以減少關聯的數據量。

接下來執行 Stage-2:

首先是 Map 端操作:

b894d690-0fb2-11ec-8fb8-12bb97331649.png

先掃描 a 表(圖中標 ① 處);接下來進行過濾操作 idno 》 ‘112233’(圖中標 ② 處);然后進行 left join,關聯的 key 是 idno(圖中標 ③ 處);執行完關聯操作之后會進行輸出操作,輸出的是三個字段,包括 select 的兩個字段加 group by 的一個字段(圖中標 ④ 處);然后進行 group by 操作,分組方式是 hash(圖中標 ⑤ 處);然后進行排序操作,按照 idno 進行正向排序(圖中標 ⑥ 處)。

然后是 Reduce 端操作:

b8a76c38-0fb2-11ec-8fb8-12bb97331649.png

首先進行 group by 操作,注意此時的分組方式是 mergepartial 合并分組(圖中標 ① 處);然后進行 select 操作,此時輸出的字段只有兩個了,輸出的行數是 30304 行(圖中標 ② 處);接下來執行 having 的過濾操作,過濾出 count_user》1 的字段,輸出的行數是 10101 行(圖中標 ③ 處);然后進行 limit 限制輸出的行數(圖中標 ④ 處);圖中標 ⑤ 處表示是否對文件壓縮,false 不壓縮。

執行計劃中的數據量只是預測的數據量,不是真實運行的,所以數據可能不準!

最后是 Stage-0 階段:

b8d9f658-0fb2-11ec-8fb8-12bb97331649.png

限制最終輸出的行數為 10 行。

總結

通過上面對 SQL 執行計劃的分析,總結以下幾點:

每個 stage 都是一個獨立的 MR,復雜的 hive sql 語句可以產生多個 stage,可以通過執行計劃的描述,看看具體步驟是什么。

對于 group by 的 key,必須是表中的字段,對于 having 的 key,必須是 select 的字段。

order by 是在 select 后執行的,所以 order by 的 key 必須是 select 的字段。

select 最好指明字段,select * 會增加很多不必要的消耗(CPU、IO、內存、網絡帶寬)。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    783

    瀏覽量

    45172
  • 數據庫
    +關注

    關注

    7

    文章

    3927

    瀏覽量

    66269

原文標題:Hive SQL 語句的正確執行順序

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    大促數據庫壓力激增,如何一眼定位 SQL 執行來源?

    語句成為了性能瓶頸。面對這樣的困境,本篇文章提出了對 SQL 進行 “染色” 的方法幫助大家 一眼定位問題 SQL,而無需再在多處邏輯中輾轉騰挪 。本文的思路主要受之前郭忠強老師發布的 如何一眼定位
    的頭像 發表于 06-10 11:32 ?163次閱讀
    大促數據庫壓力激增,如何一眼定位 <b class='flag-5'>SQL</b> <b class='flag-5'>執行</b>來源?

    如何一眼定位SQL的代碼來源:一款SQL染色標記的簡易MyBatis插件

    作者:京東物流 郭忠強 導語 本文分析了后端研發和運維在日常工作中所面臨的線上SQL定位排查痛點,基于姓名貼的靈感,設計和開發了一款SQL染色標記的MyBatis插件。該插件輕量高效,對業務代碼無
    的頭像 發表于 03-05 11:36 ?420次閱讀
    如何一眼定位<b class='flag-5'>SQL</b>的代碼來源:一款<b class='flag-5'>SQL</b>染色標記的簡易MyBatis插件

    如何通過實驗測試驗證電源濾波器的設計符合預期的性能指標

    電源濾波器在電子設備中至關重要,需通過嚴謹實驗測試驗證設計。測試涵蓋插入損耗、通帶特性、阻帶衰減等性能指標,還需進行可靠性測試,確保濾波器長期穩定運行。
    的頭像 發表于 02-14 15:31 ?397次閱讀
    如何<b class='flag-5'>通過</b>實驗測試<b class='flag-5'>來</b><b class='flag-5'>驗證</b>電源濾波器的設計符合預期的性能指標

    Devart: dbForge Compare Bundle for SQL Server—比較SQL數據庫最簡單、最準確的方法

    、備份和腳本文件夾中的數據差異。它可以同步任意數量數據庫中的數據,只需點擊幾下即可恢復損壞或丟失的數據。 dbForge模式比較 幫助比較數據庫模式,分析差異,并通過SQL腳本同步差異。它適用于所有
    的頭像 發表于 01-17 11:35 ?566次閱讀

    dbForge Studio For SQL Server:用于有效開發的最佳SQL Server集成開發環境

    dbForge Studio For SQL Server:用于有效開發的最佳SQL Server集成開發環境 SQL編碼助手 SQL代碼分析 查詢分析器 可視化查詢生成器 數據和模式
    的頭像 發表于 01-16 10:36 ?746次閱讀

    Devart::dbForge SQL Complete讓生產力上一個臺階

    工作效率而定制的。 使用SQL Complete的主要原因 干凈、高質量的代碼 使用智能感知代碼補全,開發純凈的、沒有錯誤的代碼。 提高生產率 使用豐富的內置代碼段集合,修改和/或創建自定義代碼段,使您的編碼速度翻倍。 早期錯誤檢測 使用高級T-
    的頭像 發表于 01-14 11:09 ?625次閱讀
    Devart::dbForge <b class='flag-5'>SQL</b> Complete讓生產力上一個臺階

    通過Skyvia Connect SQL終端節點訪問任何數據

    通過 Skyvia Connect SQL 終端節點訪問任何數據 ? 通過 Skyvia Connect SQL 終端節點訪問任何數據ADO.NET 數據網關 使用 Skyvia Co
    的頭像 發表于 01-02 09:31 ?371次閱讀
    <b class='flag-5'>通過</b>Skyvia Connect <b class='flag-5'>SQL</b>終端節點訪問任何數據

    淺談SQL優化小技巧

    存儲在緩存中的數據; (3)未命中緩存后,MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的解析樹,MySQL解析器將使用MySQL語法進行驗證和解析。 例如,驗證是否使用了錯
    的頭像 發表于 12-25 09:59 ?871次閱讀

    SQL錯誤代碼及解決方案

    SQL數據庫開發和管理中,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在錯誤消息中明確指出是語法錯誤。 原因 :SQL語句
    的頭像 發表于 11-19 10:21 ?6548次閱讀

    常用SQL函數及其用法

    SQL 函數及其用法: 一、聚合函數(Aggregate Functions) 聚合函數對一組值執行計算,并返回單個值。 COUNT() 用途 :返回匹配指定條件的行數。 示例 : SELECT
    的頭像 發表于 11-19 10:18 ?1454次閱讀

    SQL與NoSQL的區別

    景。 SQL數據庫 SQL數據庫,也稱為關系型數據庫管理系統(RDBMS),是一種基于關系模型的數據庫。它使用表格、行和列組織數據,并通過SQL
    的頭像 發表于 11-19 10:15 ?611次閱讀

    大數據從業者必知必會的Hive SQL調優技巧

    不盡人意。本文針對Hive SQL的性能優化進行深入研究,提出了一系列可行的調優方案,并給出了相應的優化案例和優化前后的SQL代碼。通過合理的優化策略和技巧,能夠顯著提升Hive SQL
    的頭像 發表于 09-24 13:30 ?701次閱讀

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫。 SQL Server數據庫出現823錯誤的
    的頭像 發表于 09-20 11:46 ?707次閱讀
    數據庫數據恢復—<b class='flag-5'>SQL</b> Server數據庫出現823錯誤的數據恢復案例

    IP 地址在 SQL 注入攻擊中的作用及防范策略

    SQL 注入是通過將惡意的 SQL 代碼插入到輸入參數中,欺騙應用程序執行這些惡意代碼,從而實現對數據庫的非法操作。例如,在一個登錄表單中,如果輸入的用戶名被直接拼接到
    的頭像 發表于 08-05 17:36 ?644次閱讀

    PLC通過IGT智能網關快速實現WebService接口調用案例

    IGT-SER系列智能網關支持PLC設備數據對接到各種系統平臺,包括SQL數據庫,以及MQTT、HTTP協議的數據服務端;通過其邊緣計算功能和腳本生成的工具軟件,非常方便快速實現PLC、智能儀表
    發表于 07-26 09:51
    主站蜘蛛池模板: 久久久久久久久久久观看 | 亚洲天堂伦理 | 一区| 蕾丝视频成人★在线观看 | 2021久久精品国产99国产精品 | 亚洲国产精品久久久久婷婷老年 | 国产精品福利一区二区亚瑟 | 欧美精品四虎在线观看 | 成人毛片在线播放 | 国产在线精彩视频二区 | 日日干夜夜操视频 | 大黄一级片| 四虎影院成人 | 上一篇26p国模 | 国模在线观看 | 高清午夜毛片 | 亚洲va久久久噜噜噜久久狠狠 | 国产精品一区在线播放 | 男啪女色黄无遮挡免费观看 | 性国产精品 | 精品国产免费一区二区 | 日本大片免aaa费观看视频 | 69ww免费视频播放器 | 国内免费视频成人精品 | 成人黄色免费网站 | 3344a毛片在线看 | 末成年一级在线看片 | 亚洲欧美综合一区 | 中文字幕在线观看一区二区 | 天堂资源在线bt种子 | 欧美一区二区三区男人的天堂 | 久久久久久人精品免费费看 | 激情在线视频 | 国模精品一区二区 | 天堂在线视频观看 | 免费亚洲成人 | 三级黄a | 97精品伊人久久大香线蕉 | 日韩中文电影 | 免费被视频网站在线观看 | 亚洲人与牲动交xxxxbbbb |