POSTGRESQL SQL 語句案例,一場由LIMIT 1 引發的“奇怪異像”
最近一段工作很少最佳化SQL ,實際
上7-8年前的確有一段瘋狂最佳化的“美好時光”。 最近一個同事提出一個問題,他的一個POSTGRESQL 的SQL 在執行中因為客戶的需要,將語句新增limit 1 ,但是在新增完畢後,整體語句執行時間超過原有的語句少則9倍,多則20多倍,從不到2秒,變成了23秒。
下面是語句的修改版,不少部分已經改名了。
REPLACE ( REPLACE ( REPLACE ( REPLACE ( ticket_code_serials, '["', '' ), '"]', '' ), '"', '' ), ',', ';' ) AS ticket_code,
由於語句是否的複雜,如果要非常的明白的分析出來,則需要很長的時間,實際上抓住了兩點
1 複雜的語句如果使用了limit 1,需要注意在POSTGRESQL 13中的語句是否還能透過最佳化器,優先判斷對資料進行大表過濾,由於使用LIMIT 1 這樣的語句,導致語句最佳化和執行系統對於提取的資料的有序性判斷過於複雜,導致最佳化器,按照語句的撰寫方式進行了資料的執行,保證提取資料的優秀和有效性,同時多個不同表的欄位最終進行排序,加重了執行分析器的負擔,導致執行分析器躺平,做了保守的執行計劃的操作。
2 業務邏輯是否需要對於LIMIT 1 的語句進行排序的分析,這點非常有必要,在語句的執行中大部分語句的撰寫尤其類似這樣OLAP 很重的語句一般都帶有排序,但是如果只是在結果中取一個結果 limit 1 則是否有必要進行排序這點非常有必要進行確認。一般根據語句的邏輯,是沒有必要進行排序在LIMIT 1,因為你是隨機取和順序是無關的。
這個語句實際上最後最佳化的手段就是去掉ORDER BY ,最終去掉後比原先的同樣的條件,執行的效率提高了 62倍,在 150毫秒左右就將結果計算出來,同時還有一個因素是如果你在撰寫語句的時候帶有LIMIT 1 則POSTGRESQL 的最佳化器會優先選擇計算成本中,第一個啟動成本較低的執行計劃而不是整體成本較低的執行計劃,所以建議在一些語句中,考慮業務的需求的情況下,分析是否有必要進行排序,慎用在複雜語句中的排序導致的執行效率低下的問題。
另外這裡還有一個在使用LIMIT 1 後導致的PG執行計劃的傾向性的問題,你造嗎 !
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2938247/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 由於版本升級引發的SQL語句故障SQL
- 由於版本升級引發的SQL語句故障(續)SQL
- 一場由postcss-bem引發的血案CSS
- sql語句的優化案例分析SQL優化
- 一個SQL語句引發的ORA-00600錯誤排查(一)SQL
- postgresql dba常用sql查詢語句SQL
- 由一條sql語句導致的系統IO問題SQL
- [20141013]奇怪的sql語句.txtSQL
- sql server 2005下奇怪的Delete Top 語句(downmoon)SQLServerdelete
- 【高併發】由InterruptedException異常引發的思考Exception
- MySQL 中 一條 order by index limit 語句的分析MySqlIndexMIT
- 一個SQL語句引發的ORA-00600錯誤排查(二)SQL
- 一場 Kafka CRC 異常引發的血案Kafka
- mysql limit語句優化MySqlMIT優化
- order by limit 引發的思考MIT
- MySQL 5.7 LIMIT語句介紹MySqlMIT
- JS語法: 由++[[]][+[]]+[+[]] = 10 ?引發的問題JS
- 由一個emoji引發的思考
- 由SQL語句執行過程觸發對Oracle體系結構的思考SQLOracle
- MySQL:一個奇怪的hang案例MySql
- 【Gp】PostgreSql中如何kill掉正在執行的sql語句SQL
- SQL優化之limit 1SQL優化MIT
- 兩個看似奇怪的MySQL語句問題MySql
- 一場由AI引發的GPU血案,AMD還有機會嗎?AIGPU
- SQL 常用語句一覽SQL
- 一些SQL語句SQL
- 【轉】經典SQL語句大全1SQL
- 一場由React引發的前後端分離架構的思考React後端架構
- 一個SQL語句的優化SQL優化
- 一條SQL語句的書寫SQL
- 一條很 巧妙的 SQL 語句SQL
- 一條sql語句的優化SQL優化
- 一條SQL語句的旅行之路SQL
- PostgreSQL與Oracle的sql差異SQLOracle
- 一條簡單SQL語句的構成及語句解析SQL
- 由小機硬碟引發的事件(一)硬碟事件
- 執行SQL語句查詢時出現一個SQLException異常SQLException
- 【sql】編寫基本的SQL SELECT語句一SQL