錯誤資料導致優化器不識別(高階優化手法用盡,結果盡然是這樣)
自己原文公眾號: https://mp.weixin.qq.com/s/Zt2_WCCi0V0Y82NzWKx7lQ
有個人找到我說語句太慢。語句核心部分是這樣的。我提煉一下。
SELECT * FROM log a WHERE a.create_time >= to_date('2018-01-01', 'yyyy-mm-dd') AND a.create_time <= to_date('2021-06-30', 'yyyy-mm-dd')。我第一反應你這個查3年必然慢。當然事情如果就這樣簡單,就不用寫這個帖子了。因為我讓他試了一下我查一年和查3年的執行計劃居然是一樣的。更加想不到的是查一個月和查3年也是一樣的,都是全表。
看到這裡大家第一反應是沒索引對嗎?這個我當然也想到了。我讓他看了一看有的。而且看這個SQL的語法就知道是Oracle的。索引對型別也對。
那麼干擾執行計劃的最大可能是統計資訊,我讓他看了一下也是不久前收集的,應該問題不大。但是抱著奇葩的心理就奇葩來一下。這裡考驗的就是幹不幹做了?憑藉經驗這個壓力不大因為全表資料才幾千萬(表不過億在我這裡都不好意思叫大表)。反饋給我果然7秒完成了。定睛一看執行計劃,它居然是紋絲不動。
那麼索引有問題?儘管Oracle可以線上create index還可以開並行,但是這個我覺得操作比統計資訊重太多了。等低峰時候在做,告知他先等等。在這期間我想到了直方圖。發現了點問題。這個時間怎麼才兩個桶?不科學啊。
難道說讓我遇到了可遇不可求的高階問題?經常看高手們如何推算統計資訊以及玩轉資料分佈,這次終於有機會看看了。不過多年工作中Oracle的統計資訊和直方圖一直很給力,雖然看到過一些極端案例有問題,但是我自己沒遇到過。後來我讓他嘗試了我的想法,給出了直方圖的更改。
直方圖針對列做了以後終於不是2個了,達到了我的預期。再過來看執行計劃,快哭了。還是依舊。在直方圖做的時候順帶也線上重建索引了。也就是說中高低端的手法基本都用了,沒效果。我估計今天要折在這裡了。
好吧,既然如此怎麼都不給面子,那麼就抱著最後一絲希望讓我們來看看這些資料長什麼樣子吧?抽了10條資料一看。
很好很好。原來樣本資料說明了一切。我讓開發把語句改成了。
SELECT * FROM log a WHERE a.create_time >= to_date('2021/08/01', 'yyyy/mm/dd') AND a.create_time <= to_date('2021/08/30', 'yyyy/mm/dd')。這次結果是我們預期的了。
主要原因是有些程式寫入的時候時間格式不是標準的格式,而我們用標準格式去查到了年以後就是比/和-後面都沒有用了。所以這就是之前為什麼直方圖就2個。只有2020和2021。即使我強刷直方圖也沒用。好在這個表沒有即使/又是-的。
雖然解決了,差點以為是妖孽問題。要是隻處理後臺我估計就無法解決了,最後是實地考察解決了問題。Oracle的統計資訊和直方圖還是給力的。當然MySQL和PG這些也是可以的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847150/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- FIRST_ROWS優化模式訪問遠端表可能導致錯誤結果(二)優化模式
- FIRST_ROWS優化模式訪問遠端表可能導致錯誤結果(一)優化模式
- CHAR型別函式索引導致結果錯誤型別函式索引
- 高階iOS應用效能優化iOS優化
- MySQL 高階優化MySql優化
- Hive高階優化Hive優化
- 效能優化部分——高階SQL優化2優化SQL
- inode節點耗盡導致資料庫OOM資料庫OOM
- HttpRunner 的結果校驗器優化HTTP優化
- flutter盡然還能有這種操作!!!Flutter
- MySQL 優化三(優化規則)(高階篇)MySql優化
- Spark效能優化:優化資料結構Spark優化資料結構
- Passport 設定token 過期時間盡然不生效!這是為什麼?Passport
- crond不斷喚起sendmail導致資源耗盡的排查AI
- Mysql高階優化(一)MySql優化
- Mysql高階優化(二)MySql優化
- React高階效能優化React優化
- SQL優化思路&結果集重用優化、分割槽索引優化測試SQL優化索引
- 搜尋結果頁優化優化
- 資料庫應用優化(二)伺服器和配置優化資料庫優化伺服器
- MySQL 優化一(高階篇)MySql優化
- MySQL 優化(二)(高階篇)MySql優化
- SQL精華總結索引型別優化SQL優化事務大表優化思維導圖❤️SQL索引型別優化
- 識別這5個錯誤,進階高階web前端工程師!Web前端工程師
- 新手網站建設優化,這些網站為你提供數之不盡的免費素材!(3)網站優化
- MySQL in UnionAll結果集的優化MySql優化
- PostgreSQL10.0preview效能增強-hash,nestloopjoin優化(聰明的優化器是這樣的)SQLViewOOP優化
- 資料庫優化 - SQL優化資料庫優化SQL
- Spark效能優化指南:高階篇Spark優化
- jQuery高階技巧——效能優化篇jQuery優化
- Oracle資料的優化器有兩種優化方法:Oracle優化
- MySQL資料庫效能優化之表結構優化(轉)MySql資料庫優化
- TensorFlow筆記(5)——優化手寫數字識別模型之優化器筆記優化模型
- hive優化-資料傾斜優化Hive優化
- TableView 優化之資料模型優化View優化模型
- Tableau視覺化結果的優化小技巧(二)視覺化優化
- 資料庫引擎優化顧問與索引優化的差別資料庫優化索引
- 使用FORCESEEK表進行高階優化優化