色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

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

作者:京東物流 向往

一、背景

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

為此,基于個人經驗、理解與實踐,我總結了一些方法和技巧,能讓SQL盡量變得優雅,即兼顧代碼可讀性和執行性能兩方面的提升。

二、方法與技巧

1.子查詢與謂詞下推

很多同事在寫關聯邏輯時,習慣于直接將原表關聯,隨后在最下方用一大段WHERE語句進行條件過濾,如下示例:

// -------------------- 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主要有兩個問題:

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

2.全表關聯時沒有對關聯鍵進行NULL值處理,如果相關表的對應字段存在大量NULL值,會引起數據傾斜。

第一個問題涉及SQL的謂詞下推,即寫條件時,應該在不影響結果的情況下,盡量將過濾條件下推到join之前進行(“下推”指將條件推到靠近數據源的位置而不是SQL語句的方位)。謂詞下推后,過濾條件在map端執行,減少了map端的輸出,降低了數據在集群上傳輸的量,節約了集群的資源,也可以提升任務的性能。

對于常用的INNER JOIN和LEFT OUTER JOIN,謂詞下推規則如下:

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

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

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

審核編輯 黃宇

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

    關注

    1

    文章

    773

    瀏覽量

    44219
  • null
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3993
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

    提供程序支持 .NET Framework 4.5 及更高版本。 SQL 支持 完全支持數據庫和云應用程序的 SQL。 ADO.NET 技術支持 提供對 ADO.NET standard 和所有主要 ADO.NET 類的完全支
    的頭像 發表于 01-02 09:31 ?107次閱讀
    通過Skyvia Connect <b class='flag-5'>SQL</b>終端節點訪問任何數據

    SQL錯誤代碼及解決方案

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

    常用SQL函數及其用法

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

    SQL與NoSQL的區別

    在信息技術領域,數據庫是存儲和管理數據的核心組件。隨著互聯網的發展和大數據時代的到來,對數據庫的需求也在不斷變化。SQL和NoSQL作為兩種主流的數據庫管理系統,各自有著獨特的優勢和應用場
    的頭像 發表于 11-19 10:15 ?216次閱讀

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

    大數據從業者必知必會的Hive SQL調優技巧 摘要 :在大數據領域中,Hive SQL被廣泛應用于數據倉庫的數據查詢和分析。然而,由于數據量龐大和復雜的查詢需求,Hive SQL查詢的性能往往
    的頭像 發表于 09-24 13:30 ?313次閱讀

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

    數據庫在各個領域的逐步應用,其安全性也備受關注。SQL 注入攻擊作為一種常見的數據庫攻擊手段,給網絡安全帶來了巨大威脅。今天我們來聊一聊SQL 注入攻擊的基本知識。 SQL 注入攻擊的基本原理
    的頭像 發表于 08-05 17:36 ?354次閱讀

    如何在SQL中創建觸發器

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

    恒訊科技分析:sql數據庫怎么用?

    SQL數據庫的使用通常包括以下幾個基本步驟: 1、選擇數據庫系統: 選擇適合您需求的SQL數據庫系統,如MySQL、PostgreSQL、Microsoft SQL Server、SQLite等
    的頭像 發表于 07-15 14:40 ?399次閱讀

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

    簡介 在實時數據開發過程中,大家經常會用 Flink SQL 或者 Flink DataStream API 來做數據加工。通常情況下選用2者都能加工出想要的數據,但是總會有 Flink SQL
    的頭像 發表于 07-09 20:50 ?362次閱讀

    SQL全外連接剖析

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

    如何開始監控SQL Server環境?

    一些問題,但這既麻煩又低效,尤其是當您的環境中有許多SQL服務器時。 如果您使用監控工具,則需要有一個好的策略,這需要遵循一些經過驗證的步驟。 第1步:發現SQL服務器 發現您需要監控的所有S
    的頭像 發表于 02-28 17:25 ?438次閱讀

    為什么需要監控SQL服務器?

    服務器是存儲、處理和管理數據的關系數據庫管理系統 (RDBMS) 工具或軟件,例如Microsoft的MSSQL、Oracle DB和PostgreSQL。此外,服務器執行SQL查詢和命令來操作關系數據庫。實際上,SQL服務器將托管數據庫和
    的頭像 發表于 02-19 17:19 ?509次閱讀
    主站蜘蛛池模板: 九九热视频这里只有精 | 国产成人欧美日韩在线电影 | 成年视频xxxxxx在线 | 99精品免费久久久久久久久蜜桃 | 性高跟鞋xxxxhd | 99久久国产综合精品成人影院 | 性欧美videofree中文字幕 | hd性欧美俱乐部中文 | 亚洲第一成年网站视频 | 久艾草在线精品视频在线观看 | 免费精品美女久久久久久久久久 | 囯产精品久久久久免费蜜桃 | 思思99精品国产自在现线 | 国产在线精品视亚洲不卡 | 亚洲视频国产 | 国产精品综合AV一区二区国产馆 | xiao77唯美清纯 | 久久久久国产精品嫩草影院 | 97一期涩涩97片久久久久久久 | 中文国产成人精品久久免费 | 各种肉黄浪荡故事集 | 亚洲午夜电影 | 日韩 国产 中文 无码 | 快播理论片 | 高H黄暴NP辣H一女多男 | 欧美性暴力变态xxxx | fyeex性欧美人与曾 | 女人18毛片 | 小妇人电影免费完整观看2021 | 日本色女孩影院 | 综合色就爱涩涩涩综合婷婷 | 果冻传媒2021一二三在线观看 | 日日AV夜夜添久久奶无码 | 郭德纲于谦2012最新相声 | 日韩熟女精品一区二区三区 | 国产精品伦一区二区三级视频 | 国产精品香蕉视频在线 | 97超碰在线视频人人av | 国产成+人+综合+亚洲不卡 | 95国产精品人妻无码久 | 亚洲免费网站观看视频 |