想學好程式?那你一定要搞懂 hint 用法!
誒,大家今天要來跟大家分享一下我最近在資料庫優化上的一個小發現,就是關於 Hint 的用法。之前一直覺得 Hint 是個很玄的東西,好像是給那些大神用的,我們這種小咖就隨便寫寫 SQL 就好。但最近遇到一個查詢效能瓶頸,搞半天都沒搞定,最後還是靠 Hint 才解決,所以今天就來跟大家分享一下我的實戰經驗。
一開始,我遇到一個超慢的查詢,大概長這樣:

SELECT FROM 某個很大的表 WHERE 條件一堆;
跑起來真的是等到天荒地老,我都快睡著。本來想說加個索引試試看,結果加也沒啥用,還是一樣慢。後來我就想說,死馬當活馬醫,來試試看 Hint 好。
什麼是 Hint?
簡單來說,Hint 就是一種可以告訴資料庫「你要怎麼執行這個查詢」的指令。就像你跟一個很笨的員工說:「欸,你去把那個檔案拿來,記得要從左邊的抽屜拿,不要拿錯!」Hint 就是那個「記得要從左邊的抽屜拿」的指令。
那 Hint 要怎麼用?其實不難,就是在 SELECT、DELETE 這些關鍵字後面,加上一個註解,然後在註解裡面寫上你要給資料庫的指令。不過要注意的是,這個註解的格式有點特別,一定要是 /+ ... /
這樣,中間的加號不能省略,也不能有空格,不然資料庫會看不懂。
我查一下資料,發現有很多種 Hint 可以用,像是 ALL_ROWS
、FIRST_ROWS
這些,看得我眼花撩亂。後來我發現一個叫 ALL_ROWS
的 Hint,好像是跟「最佳吞吐量」有關,感覺就是可以讓查詢跑快一點的樣子,所以我就決定先試試看這個。
所以我就把我的 SQL 改成這樣:
SELECT /+ ALL_ROWS / FROM 某個很大的表 WHERE 條件一堆;
然後再跑一次,哇!竟然變快!雖然沒有快到飛起來,但是至少不用等到睡著。這時候我才知道,原來 Hint 這麼好用!
繼續實驗
後來,我又試幾個不同的 Hint,像是指定要用哪個索引之類的,發現有些 Hint 真的可以讓查詢變快,但有些 Hint 就沒什麼效果,甚至還會讓查詢變慢。Hint 這種東西,還是要多試試看,才知道哪個最適合你的查詢。
經過這次的經驗,我學到一件事:

- 遇到慢查詢不要放棄,可以試試看 Hint。
- Hint 有很多種,要多方嘗試。
- Hint 不是萬靈丹,有時候還是要從 SQL 本身下手。
總之,Hint 是一個很有趣的東西,雖然有點難懂,但是學會之後,真的可以讓你的 SQL 功力大增。希望今天的分享對大家有幫助,下次遇到慢查詢的時候,不妨試試看 Hint !