1

有什麼區別?我知道SQL查詢的執行計劃與函數一樣好。PostgreSQL對特定SQL與功能的性能

我foud someone講述:

性能是一個問題,我們懷疑查詢規劃可能是一個 根本原因。我已將腳本從ad-hoc SQL重寫爲PostgreSQL函數(CREATE FUNCTION) ,我們看到服務器負載相對較差 。

但是爲什麼?

回答

1

的即席查詢的查詢計劃是緩存,只爲prepared statements。 PL/pgSQL函數在內部處理所有SQL語句,如準備好的語句。 (動態SQL的顯着例外與EXECUTE。)每個爲當前會話的範圍,不超出。

因此PL/pgSQL函數(不是SQL函數!)可以幫助在同一個會話中重複執行復雜的查詢。就像準備好的陳述。

客戶端軟件默認情況下可能使用準備好的語句。或者"extended query" protocol,達到同樣的效果。

相關:

即開始the thread on pgsql-general的相關答案你指的是:

還共同請參閱手冊中關於PL/pgSQL的章節Plan Caching

+0

我被告知,查詢得到他們的執行計劃緩存[這裏](https://stackoverflow.com/questions/46677509/postgresql-function-execution-plan-cache-principle/46678190?noredirect=1#comment80305222_46678190) –

+0

@YevgeniyAfanasyev:這是一個誤解。 ad-hoc SQL語句的查詢計劃未被緩存。僅用於準備好的語句。 –

+0

沒錯。我假設你正在使用準備好的語句,因爲如果你甚至想*關於計劃如何緩存在函數等中的細節,那麼你已經做到了這一點,作爲降低計劃成本的第一步。另外,如果被調用的函數是可嵌入的SQL函數,則可以間接調用plpgsql函數來緩存該函數。 –