綁定sql執行計劃,大家一定會想到sql hint,通過hint告訴優化器你要用什麼通路方法,用什麼join方法,join的順序,驅動表等等。
但是sql hint有一定的弊端,它需要修改應用程式中的sql語句,把sql加上hint。
對pg_hint_plan感興趣的同學,可以參考我寫到文檔
<a href="https://yq.aliyun.com/articles/57945">https://yq.aliyun.com/articles/57945</a>
但是,有什麼方法可以在不修改應用程式,不修改sql的情況下,鎖定sql的執行計劃呢?
要鎖定執行計劃,同樣要用到postgresql的 hook,在生成plan時動手。
源碼
<a href="https://github.com/postgrespro/sr_plan">https://github.com/postgrespro/sr_plan</a>
原理如下圖
parser的hook,用于擷取query text。
planner的hook,幹了兩間事情,
.1. 在開啟了writer模式時,判斷表中是否有該sql的執行計劃,沒有的話就将planner記錄在表中。
.2. 從表中讀取到對應的執行計劃,傳給executor,進而達到鎖定執行計劃的目的。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuEzYkZ2MwEDM3AjZwgzNjBzNiVTY2ITOjJmZlNDO2gzY0MjZ2MTY0AzLcNXZslmZxl3Lc12bj5ycj5Wd5lGbh5Sdvhmen5WYo1ibj1ycz92Lc9CX6MHc0RHaiojIsJye.png)
安裝略
在需要鎖定執行計劃的資料庫中建立擴充
生成正确的執行計劃
連接配接到對應資料庫,并打開一個會話
讓優化器使用已生成的執行計劃
生成後的執行計劃,并不會馬上生效,需要更新sr_plans.enable字段
對于使用參數的query,同樣适用。
.1. 擷取query text
src/backend/optimizer/plan/planner.c
.2.
src/backend/parser/analyze.c
對相應的表執行ddl之後,記得清理在sr_plans中對應表的執行計劃。
祝大家玩得開心,歡迎随時來 阿裡雲促膝長談 業務需求 ,恭候光臨。
阿裡雲的小夥伴們加油,努力做 最貼地氣的雲資料庫 。