国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過explain來驗(yàn)證sql的執(zhí)行順序

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

掃碼添加小助手

加入工程師交流群

關(guān)于 sql 語句的執(zhí)行順序網(wǎng)上有很多資料,但是大多都沒進(jìn)行驗(yàn)證,并且很多都有點(diǎn)小錯(cuò)誤,尤其是對于 select 和 group by 執(zhí)行的先后順序,有說 select 先執(zhí)行,有說 group by 先執(zhí)行,到底它倆誰先執(zhí)行呢?

今天我們通過 explain 來驗(yàn)證下 sql 的執(zhí)行順序。

在驗(yàn)證之前,先說結(jié)論,Hive 中 sql 語句的執(zhí)行順序如下:

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

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

下面我們通過一個(gè) 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 語句是可以成功執(zhí)行的,我們看下它在 MR 中的執(zhí)行順序:

Map 階段:

執(zhí)行 from,進(jìn)行表的查找與加載;

執(zhí)行 where,注意:sql 語句中 left join 寫在 where 之前的,但是實(shí)際執(zhí)行先執(zhí)行 where 操作,因?yàn)?Hive 會(huì)對語句進(jìn)行優(yōu)化,如果符合謂詞下推規(guī)則,將進(jìn)行謂詞下推;

執(zhí)行 left join 操作,按照 key 進(jìn)行表的關(guān)聯(lián);

執(zhí)行輸出列的操作,注意: select 后面只有兩個(gè)字段(order_amount,userkey),此時(shí) Hive 是否只輸出這兩個(gè)字段呢,當(dāng)然不是,因?yàn)?group by 的是 idno,如果只輸出 select 的兩個(gè)字段,后面 group by 將沒有辦法對 idno 進(jìn)行分組,所以此時(shí)輸出的字段有三個(gè):idno,order_amount,userkey;

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

Reduce 階段:

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

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

執(zhí)行 having,此時(shí)才開始執(zhí)行 group by 后的 having 操作,對 count_user 進(jìn)行過濾,注意:因?yàn)樯弦徊捷敵龅闹挥?select 的兩個(gè)字段了,所以 having 的過濾字段只能是這兩個(gè)字段;

執(zhí)行 limit,限制輸出的行數(shù)為 10。

上面這個(gè)執(zhí)行順序到底對不對呢,我們可以通過 explain 執(zhí)行計(jì)劃來看下,內(nèi)容過多,我們分階段來看。

首先看下 sql 語句的執(zhí)行依賴:

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

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

首先執(zhí)行 Stage-5:

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

圖中標(biāo) ① 處是表掃描操作,注意先掃描的 b 表,也就是 left join 后面的表,然后進(jìn)行過濾操作(圖中標(biāo) ② 處),我們 sql 語句中是對 a 表進(jìn)行的過濾,但是 Hive 也會(huì)自動(dòng)對 b 表進(jìn)行相同的過濾操作,這樣可以減少關(guān)聯(lián)的數(shù)據(jù)量。

接下來執(zhí)行 Stage-2:

首先是 Map 端操作:

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

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

然后是 Reduce 端操作:

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

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

執(zhí)行計(jì)劃中的數(shù)據(jù)量只是預(yù)測的數(shù)據(jù)量,不是真實(shí)運(yùn)行的,所以數(shù)據(jù)可能不準(zhǔn)!

最后是 Stage-0 階段:

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

限制最終輸出的行數(shù)為 10 行。

總結(jié)

通過上面對 SQL 執(zhí)行計(jì)劃的分析,總結(jié)以下幾點(diǎn):

每個(gè) stage 都是一個(gè)獨(dú)立的 MR,復(fù)雜的 hive sql 語句可以產(chǎn)生多個(gè) stage,可以通過執(zhí)行計(jì)劃的描述,看看具體步驟是什么。

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

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

select 最好指明字段,select * 會(huì)增加很多不必要的消耗(CPU、IO、內(nèi)存、網(wǎng)絡(luò)帶寬)。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    789

    瀏覽量

    46695
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    4019

    瀏覽量

    68331

原文標(biāo)題:Hive SQL 語句的正確執(zhí)行順序

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用NVIDIA Nemotron RAG和Microsoft SQL Server 2025構(gòu)建高性能AI應(yīng)用

    在 Microsoft Ignite 2025 大會(huì)上,隨著 Microsoft SQL Server 2025 的發(fā)布,AI 就緒型企業(yè)數(shù)據(jù)庫愿景成為現(xiàn)實(shí),為開發(fā)者提供強(qiáng)大的新工具,例如內(nèi)置向量
    的頭像 發(fā)表于 12-01 09:31 ?790次閱讀
    使用NVIDIA Nemotron RAG和Microsoft <b class='flag-5'>SQL</b> Server 2025構(gòu)建高性能AI應(yīng)用

    【綜述】工作總有規(guī)范——測試執(zhí)行和bug

    關(guān)于測試工作的規(guī)范,上次討論了用例部分。本次將繼續(xù)聊下測試執(zhí)行期間的規(guī)范標(biāo)準(zhǔn),是主要需要測試執(zhí)行人員關(guān)注的部分。【測試執(zhí)行】測試執(zhí)行規(guī)范或標(biāo)準(zhǔn),主要是為了確保測試人員“在正確的環(huán)境做正
    的頭像 發(fā)表于 10-24 10:04 ?432次閱讀
    【綜述】工作總有規(guī)范——測試<b class='flag-5'>執(zhí)行</b>和bug

    基于優(yōu)化算法的黑盒系統(tǒng)驗(yàn)證策略

    自動(dòng)駕駛的安全驗(yàn)證是保證系統(tǒng)在給定環(huán)境中正確及安全操作的過程。系統(tǒng)的期望行為通過某些規(guī)范標(biāo)準(zhǔn)定義,而系統(tǒng)失敗指其行為違反了這些規(guī)定。
    的頭像 發(fā)表于 10-16 10:32 ?545次閱讀
    基于優(yōu)化算法的黑盒系統(tǒng)<b class='flag-5'>驗(yàn)證</b>策略

    SQL 通用數(shù)據(jù)類型

    SQL 通用數(shù)據(jù)類型 數(shù)據(jù)庫表中的每個(gè)列都要求有名稱和數(shù)據(jù)類型。Each column in a database table is required to have a name and a
    的頭像 發(fā)表于 08-18 09:46 ?709次閱讀

    Text2SQL準(zhǔn)確率暴漲22.6%!3大維度全拆

    基于 BIRD 數(shù)據(jù)集展開。 方法:提出 J-Schema 呈現(xiàn)數(shù)據(jù)庫結(jié)構(gòu)并合理提供示例值,結(jié)合思維鏈引導(dǎo)模型推理。采用 Iterative DPO 迭代訓(xùn)練,多輪迭代提升性能。用自洽性方法,通過硬 / 軟投票從多個(gè)候選答案中選最優(yōu),軟投票更優(yōu)。 結(jié)果:解決 Text2SQL
    的頭像 發(fā)表于 08-14 11:17 ?697次閱讀
    Text2<b class='flag-5'>SQL</b>準(zhǔn)確率暴漲22.6%!3大維度全拆

    不用編程序無需聯(lián)外網(wǎng),將Rockwell羅克韋爾(AB)PLC的標(biāo)簽數(shù)據(jù)存入SQL數(shù)據(jù)庫

    上報(bào)與下載’進(jìn)入數(shù)據(jù)服務(wù)配置頁面,選擇SQL遠(yuǎn)程數(shù)據(jù)庫,配置數(shù)據(jù)庫地址、PLC標(biāo)簽的參數(shù); 配置完成后要下載參數(shù),通過‘工具’->‘重啟網(wǎng)關(guān)’,重啟后,網(wǎng)關(guān)即進(jìn)入工作狀態(tài),通過讀取參數(shù)可查
    發(fā)表于 07-31 10:33

    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—SQL Server數(shù)據(jù)庫被加密如何恢復(fù)數(shù)據(jù)?

    SQL Server數(shù)據(jù)庫故障: SQL Server數(shù)據(jù)庫被加密,無法使用。 數(shù)據(jù)庫MDF、LDF、log日志文件名字被篡改。
    的頭像 發(fā)表于 06-25 13:54 ?670次閱讀
    數(shù)據(jù)庫數(shù)據(jù)恢復(fù)—<b class='flag-5'>SQL</b> Server數(shù)據(jù)庫被加密如何恢復(fù)數(shù)據(jù)?

    PLC通過智能網(wǎng)關(guān)實(shí)現(xiàn)HTTP協(xié)議通訊,先取得token后再提交獲取JSON格式的數(shù)據(jù)文件

    智能網(wǎng)關(guān)IGT-DSER集成了多種PLC的原廠協(xié)議,方便實(shí)現(xiàn)各種PLC、智能儀表通過HTTP協(xié)議與MES等各種系統(tǒng)平臺通訊對接。PLC內(nèi)不用編寫程序,通過網(wǎng)關(guān)的參數(shù)配置軟件(在附件中)配置JSON
    發(fā)表于 06-17 16:07

    達(dá)夢數(shù)據(jù)庫常用管理SQL命令詳解

    達(dá)夢數(shù)據(jù)庫常用管理SQL命令詳解
    的頭像 發(fā)表于 06-17 15:12 ?7171次閱讀
    達(dá)夢數(shù)據(jù)庫常用管理<b class='flag-5'>SQL</b>命令詳解

    大促數(shù)據(jù)庫壓力激增,如何一眼定位 SQL 執(zhí)行來源?

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

    HarmonyOS實(shí)戰(zhàn):首頁多彈窗順序彈出終極解決方案

    鏈設(shè)計(jì)模式和建造者設(shè)計(jì)模式,通過將不同的彈窗添加到彈窗處理類,然后按顯示順序。 實(shí)現(xiàn)方案 先定義基礎(chǔ)彈窗接口 DialogIntercept,統(tǒng)一彈窗的行為。intercept() 方法用于執(zhí)行下一個(gè)彈窗。show ()方法用于
    的頭像 發(fā)表于 06-09 16:47 ?796次閱讀
    HarmonyOS實(shí)戰(zhàn):首頁多彈窗<b class='flag-5'>順序</b>彈出終極解決方案

    硬件輔助驗(yàn)證(HAV) 對軟件驗(yàn)證的價(jià)值

    硬件輔助驗(yàn)證 (HAV) 有著悠久的歷史,如今作為軟件驅(qū)動(dòng)驗(yàn)證的必備技術(shù),再度受到關(guān)注。 RISC-V 可能是說明這一點(diǎn)的最好例子。HAV 能夠執(zhí)行多個(gè)周期的軟件驅(qū)動(dòng)驗(yàn)證,是加速 RI
    的頭像 發(fā)表于 05-13 18:21 ?1983次閱讀

    CPU的各種指令和執(zhí)行流程

    在集成電路設(shè)計(jì)中,CPU的指令是指計(jì)算機(jī)中央處理單元(CPU)用來執(zhí)行計(jì)算任務(wù)的基本操作指令集。這些指令是CPU能夠理解并執(zhí)行的二進(jìn)制代碼,它們在計(jì)算機(jī)內(nèi)部由硬件控制并按順序執(zhí)行,從而
    的頭像 發(fā)表于 04-18 11:24 ?2611次閱讀

    網(wǎng)線順序怎么排

    網(wǎng)線的順序排列主要遵循TIA/EIA-568A和TIA/EIA-568B這兩種主流標(biāo)準(zhǔn),其中TIA/EIA-568B標(biāo)準(zhǔn)更為常用。以下是關(guān)于網(wǎng)線順序排列的詳細(xì)解釋: 一、TIA/EIA-568B標(biāo)準(zhǔn)
    的頭像 發(fā)表于 03-07 10:36 ?1w次閱讀

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

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