一次資料庫的優化經歷
自己原文公眾號:
https://mp.weixin.qq.com/s/H5IEqcasnN4nCoipUauH1w
前幾天有個學員問我個SQL能不能優化。SQL如下:
SELECT S.CARD_NO FROM S
WHERE S.DATE BETWEEN TO_DATE('20171002 00:00:00', 'yyyymmdd hh24:mi:ss') AND TO_DATE('20180701 23:59:59', 'yyyymmdd hh24:mi:ss')
AND S.CARD_NO NOT IN
(
SELECT P.CARD_NO FROM P
WHERE P.DATE between to_date('20171002 00:00:00', 'yyyymmdd hh24:mi:ss') and to_date('20210627 23:59:59', 'yyyymmdd hh24:mi:ss')
)
AND S.CARD_NO NOT IN
(
SELECT s.CARD_NO FROM s
AND s.DATE between to_date('20171002 00:00:00', 'yyyymmdd hh24:mi:ss') and to_date('20210627 23:59:59', 'yyyymmdd hh24:mi:ss')
)
背景是
第一段的時間為2017年10月02日,到2018年07月01日。這個SQL要查詢的,就是這段時間內購買了的、並且截至2021年06月27日尚未兌換或退換的票券資訊。
第二段時間是從2017年10月2日,到2021年6月27日。排除這段時間內P表(兌換記錄表)中的資料;card_no not in,也就是把購買了並且已兌換的票券排除掉。
第三段時間是從2017年10月2日,到2021年6月27日。排除這段時間內S表(購買、退換貨記錄表)中的資料;card_no not in,就是把購買了但進行了退換的票券排除。
現在執行了3天半了,期望6小時。這個sql手動執行,晚上12點左右執行;2到3個月執行一次。
當我看到這個震驚了,雖然不是我見過最長的,但是執行3天半這個還是有點狠的。
我第一感覺是要查有效期以外有多少沒兌換的要做失效處理。如果是我,我考慮這種有個有效期。一問說長期有效。其實這是不合理的。
S表 購買、退貨記錄 大約4億條資料,從2014年至今。而條件是要查S表一年的資料。符合條件的大約1000萬。(不科學)
P表 兌換記錄 大約9千萬條資料,符合條件的大約7000萬。
然後就是1000萬的看看不在7000萬中的有多少,然後再看看再排除自己範圍中“ 退換”的資料。退是在S表,兌換是在P表。有點抓狂,有點反人類。
在經歷了差集改寫也無效的情況下,總覺得這樣去返回幾百萬總歸是不快的。
這個時候發揮一個無敵的想法,改實現方式。經過了解上次他們是執行過的。這就是為什麼結束時間都是2021年6月27日。那麼也就是說如果開始時間都是2017年10月2日,結束時間都是2021年6月27日(SQL上是這麼寫的),那麼7月10日以後執行從邏輯上來說,結果是一樣的。也就是說無需執行就用上次的結果就行。從邏輯上推斷上次的結果一定是匯出下載了,不可能查完算了。
那麼不用執行就是最高境界,英雄中有句話,劍的三個境界。 第一層境界:手中有劍心中有劍第二層境界:手中無劍心中有劍第三層境界:手中無劍心中也無劍,那就是和平。優化的最高境界就是不做。
題外話如果說時間改變了呢?也好辦。上次計算的結果落在表中,那麼這次只要看看2021年6月27日到今天的資料和上次結果的資料進行一下比較。沒多少的,幾天的資料總比幾年的資料快幾百倍吧。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847271/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一次資料庫洩露的解決經歷資料庫
- 一次非常有趣的 SQL 優化經歷SQL優化
- 一次非常有趣的sql優化經歷SQL優化
- 記一次真實的webpack優化經歷Web優化
- 記一次使用策略模式優化程式碼的經歷模式優化
- 記一次生產資料庫“意外”重啟的經歷資料庫
- MySQL全面瓦解21(番外):一次深夜優化億級資料分頁的奇妙經歷MySql優化
- 記一次 Golang 資料庫查詢元件的優化。Golang資料庫元件優化
- 記一次nodejs+mongodb資料庫專案學習經歷NodeJSMongoDB資料庫
- 記一次我的 MySQL 調優經歷MySql
- 資料庫優化 - SQL優化資料庫優化SQL
- 資料庫優化資料庫優化
- 一次vue-cli 2.x專案打包優化經歷(優化xlsx外掛)Vue優化
- 資料庫結構的優化資料庫優化
- 資料庫優化SQL資料庫優化SQL
- MySQL資料庫優化MySql資料庫優化
- 記一次資料庫查詢超時優化問題資料庫優化
- 一次奇葩的raid0+1資料恢復經歷AI資料恢復
- 記一次從刪庫到恢復的經歷
- 資料庫優化之臨時表優化資料庫優化
- 資料庫優化建議資料庫優化
- 百萬級資料庫優化資料庫優化
- 資料庫查詢優化資料庫優化
- 資料庫效能優化2資料庫優化
- MYSQL資料庫------SQL優化MySql資料庫優化
- MySql的資料庫優化到底優化啥了都(3)MySql資料庫優化
- 一次生產事故的最佳化經歷
- 【資料庫】查詢優化之子連線優化資料庫優化
- MySQL 資料庫與 SQL 優化MySql資料庫優化
- 資料庫應用優化(一)資料庫優化
- 09.Django-資料庫優化Django資料庫優化
- 【資料庫】MySQL查詢優化資料庫MySql優化
- 【資料庫】優化SQL語言資料庫優化SQL
- MySql的資料庫優化到底優啥了都??(2)MySql資料庫優化
- 資料庫效能優化-索引與sql相關優化資料庫優化索引SQL
- 記一次使用 SelectMany 的經歷
- 資料庫效能優化有哪些方式資料庫優化
- 教你七步優化資料庫優化資料庫