在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

京東云 ? 來源:京東物流 向往 ? 作者:京東物流 向往 ? 2024-12-26 10:10 ? 次閱讀

作者:京東物流 向往

一、背景

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

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

二、方法與技巧

1.子查詢與謂詞下推

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

// -------------------- 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è)問題:

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

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

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

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

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

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

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

審核編輯 黃宇

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

    關(guān)注

    1

    文章

    775

    瀏覽量

    44272
  • null
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    4008
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Devart: dbForge Compare Bundle for SQL Server—比較SQL數(shù)據(jù)庫最簡(jiǎn)單、最準(zhǔn)確的方法

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

    dbForge Studio For SQL Server:用于有效開發(fā)的最佳SQL Server集成開發(fā)環(huán)境

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

    Devart::dbForge SQL Complete讓生產(chǎn)力上一個(gè)臺(tái)階

    SQL編碼助手,適用于SSMS 和VS 該工具提供上下文感知的代碼補(bǔ)全,使SQL開發(fā)人員和數(shù)據(jù)庫管理員能夠更快地編寫代碼。 SQL Complet包含許多實(shí)用的功能,這些功能是專門為提高開發(fā)團(tuán)隊(duì)
    的頭像 發(fā)表于 01-14 11:09 ?158次閱讀
    Devart::dbForge <b class='flag-5'>SQL</b> Complete讓生產(chǎn)力上一個(gè)臺(tái)階

    通過Skyvia Connect SQL終端節(jié)點(diǎn)訪問任何數(shù)據(jù)

    提供程序支持 .NET Framework 4.5 及更高版本。 SQL 支持 完全支持?jǐn)?shù)據(jù)庫和云應(yīng)用程序的 SQL。 ADO.NET 技術(shù)支持 提供對(duì) ADO.NET standard 和所有主要 ADO.NET 類的完全支
    的頭像 發(fā)表于 01-02 09:31 ?125次閱讀
    通過Skyvia Connect <b class='flag-5'>SQL</b>終端節(jié)點(diǎn)訪問任何數(shù)據(jù)

    SQL錯(cuò)誤代碼及解決方案

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

    常用SQL函數(shù)及其用法

    SQL(Structured Query Language)是一種用于管理和操作關(guān)系數(shù)據(jù)庫的編程語言。SQL 提供了豐富的函數(shù)庫,用于數(shù)據(jù)檢索、數(shù)據(jù)更新、數(shù)據(jù)刪除以及數(shù)據(jù)聚合等操作。以下是一些常用
    的頭像 發(fā)表于 11-19 10:18 ?474次閱讀

    SQL與NoSQL的區(qū)別

    在信息技術(shù)領(lǐng)域,數(shù)據(jù)庫是存儲(chǔ)和管理數(shù)據(jù)的核心組件。隨著互聯(lián)網(wǎng)的發(fā)展和大數(shù)據(jù)時(shí)代的到來,對(duì)數(shù)據(jù)庫的需求也在不斷變化。SQL和NoSQL作為兩種主流的數(shù)據(jù)庫管理系統(tǒng),各自有著獨(dú)特的優(yōu)勢(shì)和應(yīng)用場(chǎng)
    的頭像 發(fā)表于 11-19 10:15 ?236次閱讀

    大數(shù)據(jù)從業(yè)者必知必會(huì)的Hive SQL調(diào)優(yōu)技巧

    大數(shù)據(jù)從業(yè)者必知必會(huì)的Hive SQL調(diào)優(yōu)技巧 摘要 :在大數(shù)據(jù)領(lǐng)域中,Hive SQL被廣泛應(yīng)用于數(shù)據(jù)倉庫的數(shù)據(jù)查詢和分析。然而,由于數(shù)據(jù)量龐大和復(fù)雜的查詢需求,Hive SQL查詢的性能往往
    的頭像 發(fā)表于 09-24 13:30 ?341次閱讀

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

    數(shù)據(jù)庫在各個(gè)領(lǐng)域的逐步應(yīng)用,其安全性也備受關(guān)注。SQL 注入攻擊作為一種常見的數(shù)據(jù)庫攻擊手段,給網(wǎng)絡(luò)安全帶來了巨大威脅。今天我們來聊一聊SQL 注入攻擊的基本知識(shí)。 SQL 注入攻擊的基本原理
    的頭像 發(fā)表于 08-05 17:36 ?382次閱讀

    如何在SQL中創(chuàng)建觸發(fā)器

    SQL中,觸發(fā)器(Trigger)是一種特殊類型的存儲(chǔ)過程,它自動(dòng)執(zhí)行或激活響應(yīng)表上的數(shù)據(jù)修改事件(如INSERT、UPDATE、DELETE等)。觸發(fā)器可以用于維護(hù)數(shù)據(jù)庫的完整性、自動(dòng)化復(fù)雜
    的頭像 發(fā)表于 07-18 16:01 ?2122次閱讀

    恒訊科技分析:sql數(shù)據(jù)庫怎么用?

    SQL數(shù)據(jù)庫的使用通常包括以下幾個(gè)基本步驟: 1、選擇數(shù)據(jù)庫系統(tǒng): 選擇適合您需求的SQL數(shù)據(jù)庫系統(tǒng),如MySQL、PostgreSQL、Microsoft SQL Server、SQLite等
    的頭像 發(fā)表于 07-15 14:40 ?419次閱讀

    什么是 Flink SQL 解決不了的問題?

    簡(jiǎn)介 在實(shí)時(shí)數(shù)據(jù)開發(fā)過程中,大家經(jīng)常會(huì)用 Flink SQL 或者 Flink DataStream API 來做數(shù)據(jù)加工。通常情況下選用2者都能加工出想要的數(shù)據(jù),但是總會(huì)有 Flink SQL
    的頭像 發(fā)表于 07-09 20:50 ?389次閱讀

    SQL全外連接剖析

    SQL中的全外連接是什么? 在SQL中,F(xiàn)ULLOUTERJOIN組合左外連接和右外連接的結(jié)果,并返回連接子句兩側(cè)表中的所有(匹配或不匹配)行。接下面sojson給大家詳細(xì)講解。 ? 圖解:S
    的頭像 發(fā)表于 03-19 18:28 ?2314次閱讀
    <b class='flag-5'>SQL</b>全外連接剖析

    如何開始監(jiān)控SQL Server環(huán)境?

    一些問題,但這既麻煩又低效,尤其是當(dāng)您的環(huán)境中有許多SQL服務(wù)器時(shí)。 如果您使用監(jiān)控工具,則需要有一個(gè)好的策略,這需要遵循一些經(jīng)過驗(yàn)證的步驟。 第1步:發(fā)現(xiàn)SQL服務(wù)器 發(fā)現(xiàn)您需要監(jiān)控的所有S
    的頭像 發(fā)表于 02-28 17:25 ?451次閱讀

    為什么需要監(jiān)控SQL服務(wù)器?

    服務(wù)器是存儲(chǔ)、處理和管理數(shù)據(jù)的關(guān)系數(shù)據(jù)庫管理系統(tǒng) (RDBMS) 工具或軟件,例如Microsoft的MSSQL、Oracle DB和PostgreSQL。此外,服務(wù)器執(zhí)行SQL查詢和命令來操作關(guān)系數(shù)據(jù)庫。實(shí)際上,SQL服務(wù)器將托管數(shù)據(jù)庫和
    的頭像 發(fā)表于 02-19 17:19 ?527次閱讀
    主站蜘蛛池模板: 2021国产成人精品久久 | 鲁丝一区二区三区 | 免费在线色视频 | yy4080午夜理论一级毛片 | 视频网站在线 | 色综合天天综合网国产国产人 | 天天成人 | 99涩涩| 三级网站免费 | 黑人黄色大片 | 性猛交╳xxx乱大交 性免费视频 | 亚洲2020天天堂在线观看 | 小屁孩cao大人免费网站 | 欧美肥穴| 奇米影色777四色在线首页 | 欧美日本一区二区三区道 | 国产裸体美女视频全黄 | 国产婷婷色 | 国产五月婷婷 | 男人边吃奶边爱边做视频日韩 | 黄色在线视频免费看 | 中文字幕av一区二区三区 | 久久免费观看国产精品 | 桃桃酱无缝丝袜在线播放 | 九九涩| 人人澡人人搞 | 久久亚洲国产成人影院 | 欧美女同在线观看 | 色猫成人网| 色欲情狂| 亚洲第一成年网 | 亚洲精品成人在线 | 亚洲国产精品第一区二区 | 一级做a爰片久久毛片免费看 | 又黄又爽又猛午夜性色播在线播放 | 性生i活一级一片 | 一区二区三区免费精品视频 | h视频在线免费 | 欧美作爱福利免费观看视频 | 成人国产精品毛片 | 久久综合视频网 |