天天看點

PostgreSQL Oracle相容性之 - 鎖定執行計劃(Outline system)

綁定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,進而達到鎖定執行計劃的目的。

PostgreSQL Oracle相容性之 - 鎖定執行計劃(Outline system)

安裝略

在需要鎖定執行計劃的資料庫中建立擴充

生成正确的執行計劃

連接配接到對應資料庫,并打開一個會話

讓優化器使用已生成的執行計劃

生成後的執行計劃,并不會馬上生效,需要更新sr_plans.enable字段

對于使用參數的query,同樣适用。

.1. 擷取query text

src/backend/optimizer/plan/planner.c

.2.

src/backend/parser/analyze.c

對相應的表執行ddl之後,記得清理在sr_plans中對應表的執行計劃。

祝大家玩得開心,歡迎随時來 阿裡雲促膝長談 業務需求 ,恭候光臨。

阿裡雲的小夥伴們加油,努力做 最貼地氣的雲資料庫 。