<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      完了,一條 SQL 把數據庫服務器干爆了!

      0
      分享至

      Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎、并發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!

      前言

      5月16號,一條SQL把數據庫服務器干爆了

      這個問題出現過好多次了,但是這次這個SQL是我寫的,加上最近有重要的業務在開展,產生了很多臟數據。

      當時氣氛一下就緊張起來了,快!快!快!緊急修復啊!

      看了一下SQL,確實有問題 :


      selectcount(*)fromAleftjoinBonA.b_id = B.id

      本來A表中的b_id 是bigint,但是確實設置的是varchar類型, 完了不會是我的問題吧!


      當時就先緊急發版本了,把這個SQL注釋掉了! 當時數據庫的CPU已經被打滿了,我肯定不敢再調試,但是作為一個老油條這個問題我也不能背鍋呀。

      ??那就開始我們的問題定位,和甩鍋之旅途吧??

      問題定位

      前言中已經透露了兩個關鍵關鍵信息

      1. 第一就是 A.b_id = B.id A表中b_id類型存在問題

      2. 執行計劃走的是nested loop 循環,執行計劃如下


      Finalize Aggregate (cost=97553.09..97553.10rows=1 width=8)

      -> Gather (cost=97552.88..97553.09rows=2 width=8)

      Workers Planned: 2

      ->PartialAggregate (cost=96552.88..96552.89rows=1 width=8)

      -> Nested Loop (cost=0.29..96550.62rows=903 width=0)

      -> Parallel Seq ScanonA_bak20250318 a (cost=0.00..92882.53rows=903 width=6)

      Filter: ((NOTdel)ANDp_groupAND(m_status = 1)AND((c_status)::integer= 3))

      ->IndexScan using B_pkey4onB b (cost=0.29..4.06rows=1 width=8)

      IndexCond: (id = (a.b_id)::bigint)

      Filter: (((c_path)::text ~~'9987.%'::text)OR((_path)::text ='9987'::text))


      當然,如果去掉join肯定是能解決這個問題的,但是join在我們這種數據體量正常情況是肯定沒有問題的(前提是join 兩三個表)

      猜想一:索引失效

      很容易就想到了是不是字段類型的問題,導致索引失效走了nested loop,從而導致CPU飆高呢?

      排除是索引失效導致CPU飆高的問題

      仔細看上面的執行計劃的話,會發現 索引是沒有失效的,但是確實也進行了類型轉換。


      修正數據庫字段,再看執行計劃,和上面的唯一區別就是少了一個類型轉換


      對比(修改字段類型前后)執行時間都是3s左右

      根據修改字段類型前后的執行計劃、執行時間至少能夠確認這并不是索引失效影響了SQL的執行計劃推理,以及導致CPU飆高的問題

      猜想二,改成子查詢是否能解決呢


      selectcount(*)fromAwhereb_idin(selectidfromB..)...

      執行計劃和join查詢一樣,執行時間也差不多. 也排除了改成只查詢就能解決這個問題

      猜想三,數據庫執行計劃又出毛病兒呢,不能走nested loop

      關閉當前會話的nested loop 算法(SET enable_nestloop = off;

      ),再看執行時間和執行計劃


      Finalize Aggregate (cost=98340.72..98340.73rows=1 width=8)

      -> Gather (cost=98340.50..98340.71rows=2 width=8)

      Workers Planned: 2

      ->PartialAggregate (cost=97340.50..97340.51rows=1 width=8)

      -> Parallel HashJoin(cost=4453.23..97338.24rows=903 width=0)

      Hash Cond: ((a.b_id)::bigint= b.id)

      -> Parallel Seq ScanonA_bak20250318 a (cost=0.00..92882.53rows=903 width=6)

      Filter: ((NOTdel)ANDp_groupAND(p_status = 1)AND((k_status)::integer= 3))

      -> Parallel Hash (cost=4275.41..4275.41rows=14226 width=8)

      -> Parallel Seq ScanonB b (cost=0.00..4275.41rows=14226 width=8)

      Filter: (((c_path)::text ~~'9987.%'::text)OR((c_path)::text ='9987'::text))


      執行時間:700ms ??沒錯這才是我SQL的真正執行時間,都是數據庫和服務器的問題,至少能甩給數據庫。

      ?在執行計劃探測測段,估算的A的行數為900行左右,實際上達到了應該返回幾十萬行,所以數據庫底層就把兩個表當作了數據量很少的情況,這就引發了數據庫走Nested loop 循環。這才是問題問題的根本所在。導致 Nested loop 成本 小于了 Hash join 成本。


      鍋就甩到這兒呢,下面就分享點硬核知識了

      解決方案

      這條SQL本該執行Hash join但是卻走了Nested loop,走Nested loop的原因我們也找到了,由于在執行計劃階段,預估行數的時候出了問題,導致算出得成本用Nested loop 更優,從而執行的時候選擇了錯誤的方式。

      知道了問題所在,那么就好解決了,先解決SQL中類型的轉換的問題,然后更新統計信息ANALYZE VERBOSE your_table再次查看執行計劃就回歸正常了,走hash join,并且主表的探測行數快20W了


      需要更準確的行數預估,就增加取樣的行數吧(不知道怎么設置的看下文)

      一勞永逸的方案:直接禁用nested loop循環(謹慎考慮,結合公司業務場景);開啟hint語法配置,指定執行計劃(建議)

      知識擴展(硬核知識)

      如何分析執行計劃(KingBase)

      執行計劃中的cost 和 rows 都很好理解,一個是執行成本(并不是耗時),一個返回行數,關于hash join 和 nested loop這兩個聯表算法,我就不再解釋了。

      示例一:nested loop


      Finalize Aggregate (cost=97553.09..97553.10rows=1 width=8)

      -> Gather (cost=97552.88..97553.09rows=2 width=8)

      Workers Planned: 2

      ->PartialAggregate (cost=96552.88..96552.89rows=1 width=8)

      -> Nested Loop (cost=0.29..96550.62rows=903 width=0)

      -> Parallel Seq ScanonA_bak20250318 a (cost=0.00..92882.53rows=903 width=6)

      Filter: ((NOTdel)ANDp_groupAND(m_status = 1)AND((c_status)::integer= 3))

      ->IndexScan using B_pkey4onB b (cost=0.29..4.06rows=1 width=8)

      IndexCond: (id = (a.b_id)::bigint)

      Filter: (((c_path)::text ~~'9987.%'::text)OR((_path)::text ='9987'::text))


      執行計劃詳解

      1. 頂層操作 - Finalize Aggregate

      • 這是查詢的最終操作,負責匯總各個并行工作進程的部分聚合結果。

      • 預估會返回 1 行數據,處理成本在 97553.09 到 97553.10 之間。

      2. Gather 操作

      • 該操作會協調 2 個并行工作進程,把它們的結果收集起來。

      • 它的子操作是 Partial Aggregate,也就是部分聚合。

      3. 并行處理 - Partial Aggregate

      • 每個工作進程都會進行部分聚合計算。

      • 成本估計在 96552.88 到 96552.89 之間。

      4. 數據關聯 - Nested Loop

      • 采用嵌套循環的方式將表 A 和表 B 進行連接。

      • 外層循環是對表 A 的掃描,內層循環則是對表 B 的索引掃描。

      5. 表 A 數據掃描 - Parallel Seq Scan on A_bak20250318

      • 對表 A 進行并行順序掃描,這是因為表數據沒有合適的索引,所以選擇并行處理來提高效率。

      • 掃描條件為:NOT del AND p_group AND m_status = 1 AND c_status::integer = 3。

      • 預估會返回 903 行數據,成本為 92882.53,在整個查詢成本中占比最大。

      6. 表 B 數據檢索 - Index Scan using B_pkey4 on B

      • 依據表 B 的主鍵索引(B_pkey4)來查找匹配的行。

      • 索引條件是:id = a.b_id,這表明是通過外鍵進行關聯的。

      • 過濾條件為:c_path LIKE '9987.%' OR _path = '9987'。

      • 每匹配到表 A 的一行數據,就會執行一次這個索引掃描,每次掃描成本約為 4.06。

      示例二:hash join


      Finalize Aggregate (cost=98340.72..98340.73rows=1 width=8)

      -> Gather (cost=98340.50..98340.71rows=2 width=8)

      Workers Planned: 2

      ->PartialAggregate (cost=97340.50..97340.51rows=1 width=8)

      -> Parallel HashJoin(cost=4453.23..97338.24rows=903 width=0)

      Hash Cond: ((a.b_id)::bigint= b.id)

      -> Parallel Seq ScanonA_bak20250318 a (cost=0.00..92882.53rows=903 width=6)

      Filter: ((NOTdel)ANDp_groupAND(p_status = 1)AND((k_status)::integer= 3))

      -> Parallel Hash (cost=4275.41..4275.41rows=14226 width=8)

      -> Parallel Seq ScanonB b (cost=0.00..4275.41rows=14226 width=8)

      Filter: (((c_path)::text ~~'9987.%'::text)OR((c_path)::text ='9987'::text))


      看了[示例一]得分析之后,再看這個Hash join 的計劃沒那就沒啥了。總成本從約 97,553 增加到約 98,340。

      A表的預估rows都是903 偏離實際兩個數量級了,這也是導致成本計算出了問題。

      ?還有一個重要的關鍵詞workers Planned :是一個與并行查詢執行相關的重要參數。它表示優化器計劃為當前查詢分配的并行工作進程(Worker Processes)數量,這些進程將同時執行查詢的某些操作,以提高處理速度。當一個查詢滿足以下條件時,優化器可能會選擇并行執行:

      1. 數據量足夠大:小表通常不值得并行處理。

      2. 操作支持并行:如順序掃描、哈希連接、聚合等操作可以并行化。

      3. 資源允許:服務器有足夠的 CPU 核心和內存來支持額外的工作進程

      影響執行計劃的因素

      1.SQL 本身問題

      • 鏈表方式、數量

      • 索引失效

      • 類型轉換

      • 數據量

      2.統計信息準確性

      優化器依賴表和索引的統計信息估算成本,若統計信息過時或不完整,會導致執行計劃偏差,優化方式:

      • 更新統計信息


      -- KingBase(PostgreSQL):更新統計信息

      ANALYZE your_table;

      ANALYZE VERBOSE your_table;--強制

      -- MySQL:更新統計信息

      ANALYZETABLEyour_table;


      • 增加取樣數量


      -- PostgreSQL:增加統計目標

      ALTERTABLEyour_tableALTERCOLUMNyour_columnSETSTATISTICS1000;


      3.服務器硬件配置

      • 內存不足:若innodb_buffer_pool_size過小,頻繁磁盤 I/O 會使隨機讀成本顯著增加。

      • 磁盤類型:SSD 的隨機讀寫性能遠高于 HDD,可降低random_page_cost參數。

      • CPU 核數:多核 CPU 可提升并行查詢性能,需調整max_parallel_workers_per_gather。

      4.數據分布

      • 數據傾斜:如某字段的大部分值集中在少數幾個值上。

      • 冷熱數據分布:頻繁訪問的 “熱數據” 若未緩存,會增加隨機讀成本。

      總結

      本次CPU打滿,查看數據庫這條SQL阻塞了10多條,只能說這條SQL確實消耗CPU資源,但是咱不背鍋。通過對執行計劃的分析,我們定位到是統計信息不準確,導致探測返回行數的與實際情況相差50倍,數據庫做出了錯誤的執行計劃。

      作者:提前退休的java猿

      來源:https://juejin.cn/post/7504943335841497107

      公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!

      最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!

      文章有幫助的話,點在看,轉發吧!

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      癌癥去世的人越來越多?醫生反復提醒:寧可打打牌,也別做這5事

      癌癥去世的人越來越多?醫生反復提醒:寧可打打牌,也別做這5事

      蜉蝣說
      2025-12-19 22:01:31
      我外交部突然發出警告,如果外媒消息屬實,中日事態將會相當嚴重

      我外交部突然發出警告,如果外媒消息屬實,中日事態將會相當嚴重

      影孖看世界
      2025-12-19 19:14:04
      寧波小洛熙尸檢報告披露,大量內幕遠超想象,法醫一句話信息量大

      寧波小洛熙尸檢報告披露,大量內幕遠超想象,法醫一句話信息量大

      博士觀察
      2025-12-20 22:59:58
      拔“刺”高手,伊薩克對熱刺打入7球為英超生涯最多

      拔“刺”高手,伊薩克對熱刺打入7球為英超生涯最多

      懂球帝
      2025-12-21 03:04:14
      羅素:愚蠢的四大特征

      羅素:愚蠢的四大特征

      尚曦讀史
      2025-12-19 09:55:05
      除了戰敗認輸,已經無路可走?洪森軍隊遭重創:柬埔寨或爆發內亂

      除了戰敗認輸,已經無路可走?洪森軍隊遭重創:柬埔寨或爆發內亂

      策前論
      2025-12-20 23:12:53
      柬埔寨電詐分子上演大逃亡,場面震撼!

      柬埔寨電詐分子上演大逃亡,場面震撼!

      環球熱點快評
      2025-12-20 07:53:18
      “邪修大法”做家務就是快!一分錢不花,家里就窗明幾凈~

      “邪修大法”做家務就是快!一分錢不花,家里就窗明幾凈~

      裝修秀
      2025-12-19 11:30:03
      馬云預言或將應驗了?未來5年,比開藥店還要暴利的4個方向

      馬云預言或將應驗了?未來5年,比開藥店還要暴利的4個方向

      百態人間
      2025-12-20 05:25:03
      向高市早苗示好不到24小時,張本底細被扒,父母的黑歷史也被翻出

      向高市早苗示好不到24小時,張本底細被扒,父母的黑歷史也被翻出

      天天熱點見聞
      2025-12-20 06:08:30
      民進黨支持者竟造謠“嫌犯是大陸籍” 蔣萬安駁斥

      民進黨支持者竟造謠“嫌犯是大陸籍” 蔣萬安駁斥

      看看新聞Knews
      2025-12-21 00:07:04
      55歲鐘麗緹中年發福太多!胖到180斤 胸大腚圓 滿身肥肉穿吊帶

      55歲鐘麗緹中年發福太多!胖到180斤 胸大腚圓 滿身肥肉穿吊帶

      廣西阿妹香香
      2025-12-20 15:58:58
      上海一對情侶戀愛時男方說“我養你”,分手后女方以此為證,拒絕返還40余萬元!測謊實驗后,法院判了

      上海一對情侶戀愛時男方說“我養你”,分手后女方以此為證,拒絕返還40余萬元!測謊實驗后,法院判了

      都市快報橙柿互動
      2025-12-20 09:35:12
      克林頓與愛潑斯坦案受害者共浴照片披露

      克林頓與愛潑斯坦案受害者共浴照片披露

      揚子晚報
      2025-12-20 11:50:57
      快扔掉!戴一天,輻射量相當于拍117次胸片

      快扔掉!戴一天,輻射量相當于拍117次胸片

      FM93浙江交通之聲
      2025-10-28 00:01:43
      同仁堂集團就南極磷蝦油事件致歉:全面開展品牌清理行動

      同仁堂集團就南極磷蝦油事件致歉:全面開展品牌清理行動

      界面新聞
      2025-12-20 09:03:27
      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      趣文說娛
      2025-12-20 18:29:20
      歐爾班抨擊歐盟向烏提供貸款,波蘭外長向歐爾班頒發列寧勛章

      歐爾班抨擊歐盟向烏提供貸款,波蘭外長向歐爾班頒發列寧勛章

      山河路口
      2025-12-20 19:17:58
      歐盟動用俄資產的方案未獲通過

      歐盟動用俄資產的方案未獲通過

      環球時報國際
      2025-12-20 09:31:53
      轉發野三坡隧道事故視頻被要求刪除,還有網友稱發生了爆炸

      轉發野三坡隧道事故視頻被要求刪除,還有網友稱發生了爆炸

      映射生活的身影
      2025-12-20 19:18:13
      2025-12-21 03:44:49
      Java精選
      Java精選
      一場永遠也演不完的戲
      1764文章數 3859關注度
      往期回顧 全部

      科技要聞

      許四清:具身智能的"ChatGPT時刻"還未到來

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      體育要聞

      我開了20年大巴,現在是一名西甲主帥

      娛樂要聞

      2026央視跨年晚會陣容曝光,豪華陣仗

      財經要聞

      求解“地方財政困難”

      汽車要聞

      嵐圖推進L3量產測試 已完成11萬公里實際道路驗證

      態度原創

      游戲
      手機
      教育
      公開課
      軍事航空

      逆天!LCK頒獎Faker無緣獎項,LPL解說炮轟開罵直播間差點被封

      手機要聞

      vivo X200T再曝,天璣 9400+芯片加持

      教育要聞

      別逼孩子死磕高二數學了!我用3個“懶方法”,讓倒數娃沖進前20

      公開課

      李玫瑾:為什么性格比能力更重要?

      軍事要聞

      澤連斯基:前線局勢愈發艱難

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 松下纱荣子被c到高潮下不了床| 成人性生交大片免费卡看| 国产SM重味一区二区三区| 亚洲精品自拍| 大邑县| 久久精品国产久精国产一老狼 | 亚洲成a∨人片在线观看不卡| 株洲县| 欧美熟妇xxxxx| 亚洲伊人色色| 天天躁日日躁狠狠躁欧美老妇小说| 亚洲AV日韩AV无码中出| 日韩国产色色网| 97人妻人人揉人人躁人人| 国产果冻豆传媒麻婆| 国产一区二区三区小说| 91在线观看视频| 亚洲综合社区| 中文字幕亚洲色图| 亚洲成A| 丰满人妻被猛烈进入| 少妇人妻av| 五月婷婷五月天| 国产AV无码专区亚洲AWWW| 国产精品理论片在线观看| 97人妻免费碰视频碰免| 精品久久久久久无码国产| 999zyz玖玖资源站永久| 成熟老妇女视频| 国产精品国产三级国产试看| 亚洲成人网站视频| 亚洲欧美日韩精品色xxx| 97在线视频免费人妻| 日韩国产欧美精品在线| 陇西县| 国产视频一区二区| 久久久久久久| 久久精品熟妇丰满人妻99| 狠狠人妻久久久久久综合果冻| 成人亚洲综合av天堂| 2020精品自拍视频曝光|