2017-04-03 59 views
1

我想知道如果我在PostgreSQL的準備語句,即:是否執行預先準備的聲明中跳過規劃階段的PostgreSQL

PREPARE newquery(int) AS 
SELECT * FROM table1 WHERE somefield > $1; 

將後端調用解析分析和規劃師,當我執行:

EXECUTE newquery(123); 

我發現了一些documentation,它說的是PostgreSQL的「跳過」解析準備查詢的分析和規劃,並通過這樣做,顯著優化查詢執行。

我試圖通過覆蓋post_parse_analyze_hookplanner_hook,並從他們簡單地寫一些東西到日誌文件(即「計劃被稱爲」)測試這一點,所以我可以看到,如果規劃者和分析儀被調用。這種測試方法是否有效?

我很困惑,因爲每次執行EXECUTE newquery(some number);解析分析器和計劃器都被調用。

我正在做這一切,因爲我想要統計查詢編譯了多少次以便更好地理解「查詢緩存」。

注意:我在一個會話中執行此操作。每次我連接到服務器時,我都會再次準備這些語句。

爲什麼計劃和解析分析器被調用?

+0

我想爲'EXECUTE newquery(123);'調用解析分析器,'不適合查詢下劃線和計劃器,因爲查詢計劃可能取決於參數。好問題,但讓我們等待更有經驗的人。 – Abelisto

回答

3

這必須是「定製計劃」在9.2中引入的功能。 對於預處理語句的前幾個執行,它將生成一個定製計劃,該定製計劃使用參數值,然後切換到通用計劃(即不使用參數值),如果這些計劃看起來不像通用計劃。

嘗試EXECUTE準備好的聲明至少六次,看看規劃師是否仍然被調用。

+0

謝謝!正好6次之後,策劃者沒有被叫到。還有一件事,解析分析器仍然被調用,對於'EXECUTE newquery(123);'? – ZrtvenoJagnje

+0

必須是。這是一個SQL查詢,所以需要解析。 –

+0

非常感謝,先生! – ZrtvenoJagnje