91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

SQL大寶劍-已燃盡所有SQL的理解

京東云 ? 來(lái)源:京東物流 向往 ? 作者:京東物流 向往 ? 2024-12-26 10:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:京東物流 向往

一、背景

從事數(shù)據(jù)開(kāi)發(fā)將近四年,過(guò)程中有大量任務(wù)交接或閱讀同事代碼的場(chǎng)景。在這些場(chǎng)景中發(fā)現(xiàn)有些SQL讀起來(lái)賞心悅目,可以一目了然地了解業(yè)務(wù)邏輯,一些復(fù)雜的業(yè)務(wù)需求實(shí)現(xiàn)方法也可以做到簡(jiǎn)潔優(yōu)雅,同時(shí)在性能上也有良好表現(xiàn)。而有些SQL讀起來(lái)非常艱難,時(shí)常要跨越幾百行尋找WHERE條件或者關(guān)聯(lián)字段,甚至充斥著大量相同的子查詢命名,除了作者可能少有人能快速看懂。

為此,基于個(gè)人經(jīng)驗(yàn)、理解與實(shí)踐,我總結(jié)了一些方法和技巧,能讓SQL盡量變得優(yōu)雅,即兼顧代碼可讀性和執(zhí)行性能兩方面的提升。

二、方法與技巧

1.子查詢與謂詞下推

很多同事在寫(xiě)關(guān)聯(lián)邏輯時(shí),習(xí)慣于直接將原表關(guān)聯(lián),隨后在最下方用一大段WHERE語(yǔ)句進(jìn)行條件過(guò)濾,如下示例:

// -------------------- Bad Codes ------------------------

SELECT
    f1.pin,
    c1.site_id,
    c2.site_name
FROM
    fdm.fdm1 AS f1
LEFT JOIN cdm.cdm1 AS c1
ON
    f1.erp = lower(c1.account_number)
LEFT JOIN cdm.cdm2 AS c2
ON
    c1.site_id = c2.site_code
WHERE
    f1.start_date <= '""" + start_date + """'
    AND f1.end_date > '""" + start_date + """'
    AND f1.status = 1
    AND c1.dt = '""" + start_date + """'
    AND c2.yn = 1
GROUP BY
    f1.pin,
    c1.site_id,
    c2.site_name

這段SQL主要有兩個(gè)問(wèn)題:

1.cdm1和cdm2的條件寫(xiě)在LEFT JOIN之后,因?yàn)閏dm1和cdm2是NULL補(bǔ)充表(NULL 補(bǔ)充表: 右表被稱為 NULL 補(bǔ)充表,意味著它的存在是為了補(bǔ)充左表中可能缺失的值。即使在右表中沒(méi)有與左表匹配的行,左表中的行仍然會(huì)被返回,右表的相關(guān)列會(huì)填充為 NULL),那么19和20行無(wú)法進(jìn)行謂詞下推,這會(huì)導(dǎo)致關(guān)聯(lián)時(shí)fdm1和cdm1,cdm2先進(jìn)行全表關(guān)聯(lián),再按照WHERE條件過(guò)濾分區(qū)。如果cdm1是每天全量的表,先關(guān)聯(lián)全表所掃描的數(shù)據(jù)量可想而知是相當(dāng)大的。

2.全表關(guān)聯(lián)時(shí)沒(méi)有對(duì)關(guān)聯(lián)鍵進(jìn)行NULL值處理,如果相關(guān)表的對(duì)應(yīng)字段存在大量NULL值,會(huì)引起數(shù)據(jù)傾斜。

第一個(gè)問(wèn)題涉及SQL的謂詞下推,即寫(xiě)條件時(shí),應(yīng)該在不影響結(jié)果的情況下,盡量將過(guò)濾條件下推到j(luò)oin之前進(jìn)行(“下推”指將條件推到靠近數(shù)據(jù)源的位置而不是SQL語(yǔ)句的方位)。謂詞下推后,過(guò)濾條件在map端執(zhí)行,減少了map端的輸出,降低了數(shù)據(jù)在集群上傳輸?shù)牧浚?jié)約了集群的資源,也可以提升任務(wù)的性能。

對(duì)于常用的INNER JOIN和LEFT OUTER JOIN,謂詞下推規(guī)則如下:

INNER JOIN LEFT OUTER JOIN
左表 右表 左表 右表
ON條件 下推 下推 不下推 下推
WHERE條件 下推 下推 下推 不下推

如果使用上述示例的寫(xiě)法,主要關(guān)注的是LEFT OUTER JOIN時(shí)WHERE語(yǔ)句里的條件是否會(huì)引起謂詞不下推。如果不想記這些看起來(lái)很復(fù)雜的規(guī)則怎么辦?可以如下所示直接使用子查詢:

// -------------------- Good Codes 

審核編輯 黃宇

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

    關(guān)注

    1

    文章

    789

    瀏覽量

    46680
  • null
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(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ù)庫(kù)愿景成為現(xiàn)實(shí),為開(kāi)發(fā)者提供強(qiáng)大的新工具,例如內(nèi)置向量
    的頭像 發(fā)表于 12-01 09:31 ?788次閱讀
    使用NVIDIA Nemotron RAG和Microsoft <b class='flag-5'>SQL</b> Server 2025構(gòu)建高性能AI應(yīng)用

    淺談AI時(shí)代的SQL注入攻擊

    從撰寫(xiě)邏輯嚴(yán)密的代碼,到生成富有創(chuàng)意的文案,再到在短短數(shù)秒內(nèi)處理海量市場(chǎng)數(shù)據(jù)并給出決策建議——以LLM(大語(yǔ)言模型)為代表的AI大模型,正以前所未有的速度和深度,重塑企業(yè)的生產(chǎn)和商業(yè)模式。
    的頭像 發(fā)表于 11-13 13:46 ?707次閱讀

    不用編程不用聯(lián)網(wǎng),實(shí)現(xiàn)倍福(BECKHOFF)PLC對(duì)接SQL數(shù)據(jù)庫(kù),上報(bào)和查詢數(shù)據(jù)的案例

    ?IGT-DSER智能網(wǎng)關(guān)模塊,支持各種PLC、智能儀表、遠(yuǎn)程IO與數(shù)據(jù)庫(kù)之間雙向通訊,既可以讀取設(shè)備的數(shù)據(jù)上報(bào)到SQL數(shù)據(jù)庫(kù),也可以從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)后寫(xiě)入到設(shè)備;數(shù)據(jù)庫(kù)軟件支持MySQL
    發(fā)表于 10-10 11:14

    SOLIDWORKS PDM Professional安裝部署指南:從服務(wù)器到客戶端的詳細(xì)步驟

    一份詳盡的SOLIDWORKS PDM Professional安裝指南,面向IT管理員,涵蓋從SQL Server配置、服務(wù)器安裝到客戶端設(shè)置的全過(guò)程,確保您高效、正確地完成PDM系統(tǒng)部署
    的頭像 發(fā)表于 09-11 17:37 ?1580次閱讀

    數(shù)據(jù)庫(kù)慢查詢分析與SQL優(yōu)化實(shí)戰(zhàn)技巧

    今天,我將分享我在處理數(shù)千次數(shù)據(jù)庫(kù)性能問(wèn)題中積累的實(shí)戰(zhàn)經(jīng)驗(yàn),幫助你系統(tǒng)掌握慢查詢分析與SQL優(yōu)化的核心技巧。無(wú)論你是剛?cè)腴T(mén)的運(yùn)維新手,還是有一定經(jīng)驗(yàn)的工程師,這篇文章都將為你提供實(shí)用的解決方案。
    的頭像 發(fā)表于 09-08 09:34 ?972次閱讀

    數(shù)據(jù)庫(kù)性能瓶頸分析與SQL優(yōu)化實(shí)戰(zhàn)案例

    作為一名在一線摸爬滾打8年的運(yùn)維工程師,我見(jiàn)過(guò)太多因?yàn)閿?shù)據(jù)庫(kù)性能問(wèn)題而半夜被叫醒的場(chǎng)景。今天分享幾個(gè)真實(shí)的優(yōu)化案例,希望能幫你避開(kāi)這些坑。
    的頭像 發(fā)表于 08-27 14:31 ?580次閱讀

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

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

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

    摘要 技術(shù)背景:Text2SQL 是將自然語(yǔ)言查詢轉(zhuǎn)為 SQL 的任務(wù),經(jīng)歷了基于規(guī)則、神經(jīng)網(wǎng)絡(luò)、預(yù)訓(xùn)練語(yǔ)言模型、大語(yǔ)言模型四個(gè)階段。當(dāng)前面臨提示優(yōu)化、模型訓(xùn)練、推理時(shí)增強(qiáng)三大難題,研究
    的頭像 發(fā)表于 08-14 11:17 ?693次閱讀
    Text2<b class='flag-5'>SQL</b>準(zhǔn)確率暴漲22.6%!3大維度全拆

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

    的編程軟件從PLC導(dǎo)出CSV文件,然后復(fù)制到配置表,如下圖: 再打開(kāi)Navicat查看數(shù)據(jù)庫(kù)中的數(shù)據(jù),如下圖: 網(wǎng)關(guān)支持西門(mén)子、三菱、歐姆龍、施耐德等幾乎所有的PLC品牌,通過(guò)以上參數(shù)軟件自行切換即可;關(guān)于網(wǎng)關(guān)模塊的詳細(xì)介紹可查看用戶手冊(cè)。 配置文件和軟件:*附件:CIP-SQL
    發(fā)表于 07-31 10:33

    御控網(wǎng)關(guān)如何實(shí)現(xiàn)MQTT、MODBUS、OPCUA、SQL、HTTP之間協(xié)議轉(zhuǎn)換

    在工業(yè)自動(dòng)化領(lǐng)域,不同設(shè)備、系統(tǒng)之間的通信協(xié)議就像不同的語(yǔ)言,常常讓信息交互變得困難重重。MQTT、MODBUS、OPCUA、SQL、HTTP等協(xié)議各有特點(diǎn),適用于不同的場(chǎng)景和設(shè)備,但如何讓它們之間
    的頭像 發(fā)表于 07-07 13:07 ?568次閱讀

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

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

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

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

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

    你是否曾經(jīng)遇到過(guò)這樣的情況:在大促活動(dòng)期間,用戶訪問(wèn)量驟增,數(shù)據(jù)庫(kù)的壓力陡然加大,導(dǎo)致響應(yīng)變慢甚至服務(wù)中斷?更讓人頭疼的是,當(dāng)你試圖快速定位問(wèn)題所在時(shí),卻發(fā)現(xiàn)難以確定究竟是哪個(gè)業(yè)務(wù)邏輯中的 SQL
    的頭像 發(fā)表于 06-10 11:32 ?564次閱讀
    大促數(shù)據(jù)庫(kù)壓力激增,如何一眼定位 <b class='flag-5'>SQL</b> 執(zhí)行來(lái)源?

    不用編程不用聯(lián)網(wǎng),PLC和儀表直接對(duì)SQL接數(shù)據(jù)庫(kù),有異常時(shí)還可先將數(shù)據(jù)緩存

    不用PLC編程也不用聯(lián)網(wǎng),還不用電腦,采用IGT-DSER智能網(wǎng)關(guān)實(shí)現(xiàn)PLC和儀表直接對(duì)SQL接數(shù)據(jù)庫(kù)。 跟服務(wù)端通訊有異常時(shí)還可以先將數(shù)據(jù)暫存,待故障解除后自動(dòng)重新上報(bào)到數(shù)據(jù)庫(kù);也可以實(shí)現(xiàn)從數(shù)據(jù)庫(kù)
    發(fā)表于 04-12 10:47

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

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