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

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

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

3天內不再提示

講講關于SQL大表刪除的問題

jf_ro2CN3Fa ? 來源:yes的練級攻略 ? 2023-02-03 15:19 ? 次閱讀

今天來講講關于大表刪除 的問題。

比如,你現在需要刪除一張一共有 5 億數據的表里面的 2021 年數據,假設這張表叫 yes。

我相信你腦子在 1s 內肯定會蹦出這條 SQL :

deletefromyeswherecreate_date>"2020-12-31"andcreate_date

如果直接執行這條 SQL 會發生什么問題呢?

長事務

我們需要關注到一個前提:這張表有 5 億的數據,所以它是一張超大表,因此這個 where 條件可能涉及非常多的數據,所以我們可以從離線數倉或者備庫查下數據量,然后我們發現這條 SQL 會刪除 3 億左右的數據。

那么一次性 delete 完的方案是不行的,因為這會涉及到長事務的問題

長事務涉及到加鎖,只會在事務執行完畢后才會釋放鎖,由于長事務鎖了很多數據,如果期間有頻繁的 DML 想要操作這些數據,那么就會造成阻塞。

連接都阻塞住了,業務線程自然就阻塞了,也就是說你的服務線程都在等待數據庫的響應,然后可能還會影響到別的服務,可能產生雪崩,于是就 GG 了。

長事務可能會造成主從延遲,你想想主庫執行了好久,才執行完給從庫,從庫又要重放好久,期間可能有很長一段時間數據是不同步的。

還有一種情況,業務都有個特殊停機窗口,你覺得你可以為所欲為,然后開始執行長事務了,然后執行了 5 小時之后,不知道啥情況拋錯了,事務回滾了,于是浪費了 5 個小時,還得重新開始。

綜上,我們需要避免長事務的發生。

那面對可能發生長事務的 SQL 我們怎么拆 呢?

拆 SQL

我們就以上面這條 SQL 為例:

deletefromyeswherecreate_date>"2020-12-31"andcreate_date

看到這條 SQL,如果要拆分,想必很多小伙伴會覺得很簡單,按日期拆不就完事了?

deletefromyeswherecreate_date>"2020-12-31"andcreate_date="2021-02-01"andcreate_date

......

這當然可以,恭喜你,你已經拆分成功了,沒錯就這么簡單。

但是,如果 create_date 沒有索引怎么辦?

沒索引的話,上面這就全表掃描了啊?

影響不大,沒有索引我們就給他創造索引條件,這個條件就是主鍵。

我們直接一個 select min(id)... 和 select max(id).... 得到這張表的主鍵最小值和最大值,假設答案是 233333333 和 666666666。

然后我們就可以開始操作了:

deletefromyeswhere(id>=233333333andid"2020-12-31"andcreate_date=233433333andid<233533333)?and?create_date?>"2020-12-31"andcreate_date

......

deletefromyeswhere(id>=666566666andid<=666666666)?and?create_date?>"2020-12-31"andcreate_date

當然你也可以再精確些,通過日期篩選來得到 maxId,這影響不大(不滿足條件的 SQL 執行很快,不會耗費很多時間)。

這樣一來 SQL 就滿足了分批的操作,且用得上索引。

如果哪條語句執行出錯,只會回滾小部分數據,我們重新排查下就好了,影響不大。

而且拆分 SQL 之后還可以并行提高執行效率

當然,并行可能有鎖競爭的情況,導致個別語句等待超時。不過影響不大,只要機器狀態好,執行得快,因為鎖競爭導致的等待并不一定會超時,如果個別 SQL 超時的話,重新執行就好了。

有時候要轉換思路

關于大表刪除有時候要轉換思路,把刪除轉成插入

假設還是有一張 5 億的數據表,此時你需要刪除里面 4.8 億的數據,那這時候就不要想著刪除了,要想著插入。

道理很簡單,刪除 4.8 億的數據,不如把要的 2000W 插入到新表中,我們后面業務直接用新表就好了。

這兩個數據量對比,時間效率差異不言而喻了吧?

具體操作也簡單:

創建一張新表,名為 yes_temp;

將 yes 表的 2000W 數據 select into 到 yes_temp 中;

將 yes 表 rename 成 yes_233;

將 yes_temp 表 rename 成 yes。

貍貓換太子,大功告成啦!

之前有個記錄表我們就是這樣操作的,就 select into 近一個月的數據到新表中,以前老數據就不管了,然后 rename 一下,執行得非常快。

本來預估 2 小時的 SQL 操作,1 分鐘就搞定了。

這種類似的操作是有工具的,比如 pt-online-schema-change 等,不過我沒用過,有興趣的小伙伴可以自己去看看,道理是一樣的,多了幾個觸發器,這里不多贅述了。

最后

咱們開發還是得多學一些數據庫的操作和原理,因為好多數據庫的操作都需要親力親為,小公司沒 DBA 的話就不說了,大公司的話咱也不知道 DBA 到底會關心到哪個程度,還是得靠自己靠譜。






審核編輯:劉清

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

    關注

    1

    文章

    770

    瀏覽量

    44190
  • DBA
    DBA
    +關注

    關注

    0

    文章

    18

    瀏覽量

    7890

原文標題:2 小時的 SQL 操作,1 分鐘就搞定?!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    SQL刪除出錯

    用labveiw在SQL數據庫里建了一個,想刪除列,卻總是出錯,所有的列刪除都會出相似的錯誤信息。錯誤代碼:-2147217900,信息:NI_Database_API.lvlib:
    發表于 07-09 11:15

    labview實時數據采集存入SQL內,SQL定時新建文件組和文件

    如題labview連入SQL已建好的數據內,0.8秒采集一次。我想做的是labview定時采集數據,存入SQL需要實現自動新建(每月
    發表于 09-23 11:00

    SQL與NoSQL數據庫入門基礎知識詳解

    比較麻煩。(4)數據耦合性 :SQL中不允許刪除已經被使用的外部數據,例如審核人中的"熊三"已經被分配給了借閱人熊大,那么在審核人中將不允許刪除
    發表于 12-19 13:56

    Linux環境下oracle創建和刪除空間及用戶

    #su - oracle $ sqlplus /nolog SQL> connect / as sysdba --//創建臨時空間 create temporary tablespace
    發表于 07-05 07:12

    請教用LabVIEW的Database創建SQL數據

    各位,我用LabVIEW的Database創建SQL數據時,數據類型只有字符串、數值、日期,沒有布爾型的數據類型,沒有能夠對應到SQL的bit的數據類型,請問該如何解決呢,歡迎交流
    發表于 11-30 17:57

    單片機使用本地SQL數據庫功能

    分享LS10串口數據庫模塊實現單片機存取sql數據庫功能。 關系型數據庫功能:1, 創建;2, 插入數據;3, 修改數據;4, 查詢數據;5, 刪除數據;6, 刪除
    發表于 07-01 16:57

    Transact-SQL課程

      本章要點       T-SQL語言用于管理SQL Server Database Engine實例,創建和管理數據庫對象,以及插入、檢索、修改和刪除數據。T-
    發表于 04-14 15:59 ?0次下載

    如何才能刪除SQL數據局鏡像

    SQLSERVER刪除數據庫鏡像 SQLServer刪除數據庫鏡像,其實這之前有個很詭異的問題。..在數據庫鏡像斷開后,如何從新建立鏡像的連接呢?
    發表于 09-26 17:51 ?18次下載

    SQL后悔藥,SQL性能優化和SQL規范優雅

    =10086orage=18; 2、操作delete或者update語句,加個limit(SQL后悔藥) 在執行刪除或者更新語句,盡量加上limit,以下面的這條 SQL 為例吧: deletefromeuse
    的頭像 發表于 11-14 09:54 ?1850次閱讀

    9SQL4952-9SQL4954-9SQL4958 系列數據

    9SQL4952-9SQL4954-9SQL4958 系列數據
    發表于 03-13 20:20 ?0次下載
    9<b class='flag-5'>SQL4952-9SQL4954-9SQL</b>4958 系列數據<b class='flag-5'>表</b>

    932SQL456 數據

    932SQL456 數據
    發表于 03-29 18:48 ?0次下載
    932<b class='flag-5'>SQL</b>456 數據<b class='flag-5'>表</b>

    932SQL450 數據

    932SQL450 數據
    發表于 03-29 18:48 ?0次下載
    932<b class='flag-5'>SQL</b>450 數據<b class='flag-5'>表</b>

    9SQL4952-9SQL4954-9SQL4958 系列數據

    9SQL4952-9SQL4954-9SQL4958 系列數據
    發表于 07-05 19:04 ?0次下載
    9<b class='flag-5'>SQL4952-9SQL4954-9SQL</b>4958 系列數據<b class='flag-5'>表</b>

    932SQL456 數據

    932SQL456 數據
    發表于 07-11 19:13 ?0次下載
    932<b class='flag-5'>SQL</b>456 數據<b class='flag-5'>表</b>

    932SQL450 數據

    932SQL450 數據
    發表于 07-11 19:13 ?0次下載
    932<b class='flag-5'>SQL</b>450 數據<b class='flag-5'>表</b>
    主站蜘蛛池模板: 婷婷色婷婷| 日本欧美强乱视频在线| 宅男在线看片| 中文字幕成人乱码在线电影| 黄h网站| 91在线国内在线播放大神| 国内精品第一页| 2018国产精品| 亚洲一区二区中文字幕| 男人操女人免费| 亚洲一区二区免费视频| 黄色插插插| 特级中国aaa毛片| 人人爽天天碰天天躁夜夜躁| 五月婷婷色| 香蕉视频一级| 人人97| 国产成人教育视频在线观看| 好大好硬好长好爽a网站| www.av网| 人人干日日操| 国产农村乱色xxxx| 69精品在线| 日韩在线视频免费观看| 免费一级大片| 毛片韩国| mide-776中文字幕在线| 手机看片国产福利| 欧美性另类| 7086bt伙计 福利一区| 日韩黄a级成人毛片| 国产69精品久久久久9999| 日本高清一本视频| 18满xo影院视频免费体验区| 亚洲天堂网站在线| 女人大毛片一级毛片一| 久久综合综合久久| 黄色美女网站在线观看| 忘忧草爱网| 久久天天躁夜夜躁狠狠躁2015| 窝窝午夜在线观看免费观看|