2017-04-18 91 views
0

我正在對很多查詢運行一些基準測試。我有一系列的查詢,它們會在彼此之後多次運行。我知道PostgreSQL緩存查詢計劃,所以這是重要的考慮,但據我所知,這並不總是發生。PostgreSQL在相同的查詢上接近計劃緩存?

所以我有兩種方法。我正在考慮(a)強制每次運行查詢時生成查詢計劃,或者(b)稍微「預熱」一下,以便計劃被緩存並且每次重用。我該如何執行,或者我可以採取哪些預防措施來確保其中一個發生?

如果我可以監控緩存中的計劃,但是我不確定是否有可能,那將會很棒。

更新:我的查詢是複雜的SELECTs來檢索數據,沒有DELETEs/INSERTs等。這是否意味着我不應該對查詢計劃器在基準測試中給予如此的尊重?如果

  • 你使用準備好的語句
  • 的語句是PL/pgSQL功能

所以內執行的,如果你想基準你的查詢如何更快成爲如果

回答

1

PostgreSQL只緩存查詢計劃您避免了計劃的開銷,您應該創建一個準備好的語句並至少執行六次(因爲前五次運行將始終生成自定義計劃)。

如果您的查詢很複雜,那麼如果您緩存查詢計劃,尤其是在查詢運行時間很長時,甚至可能會丟失您的查詢。在這種情況下,通常花更多的精力來規劃每個查詢。準備好的語句最大的勝利是查詢執行時間較少。

+0

謝謝!您建議通過準備好的報表進行基準測試,而不需要計劃開銷你也可以說PostgreSQL也通過PL/pgSQL函數來緩存查詢計劃 - 這意味着我可以期待相同的行爲,即如果我使用PL/pgSQL過程並執行它至少5次,那麼我可以安全地期望緩存計劃第六輪開始? – Zeruno

+0

是的,你說得對 - 在大多數情況下。有時PostgreSQL會認爲通用計劃不夠好,並繼續生成自定義計劃。爲了測試,你可以在函數內部使用'EXPLAIN EXECUTE prepared_statement'或auto_explain來聲明。如果您在那裏看到「$ 1」,則使用通用計劃。沒有參數的陳述當然總是使用通用計劃。 –

+0

感謝您解釋良好的答覆!很有幫助。 – Zeruno