2012-07-26 94 views
4

我在與Oracle合作了幾年後剛剛轉移到PostgreSQL。 我一直在研究PostgreSQL數據庫在應用程序(Java,JDBC)中準備語句的一些性能問題。PostgreSQL緩存準備好的語句(如Oracle)

Oracle在其SGA中緩存準備好的語句 - 準備好的語句池在數據庫連接之間共享。

PostgreSQL文檔似乎沒有指出這一點。下面是從文檔(https://www.postgresql.org/docs/current/static/sql-prepare.html)的片段 -

準備語句僅持續當前數據庫 會話的持續時間。當會話結束時,準備好的語句被遺忘, 因此必須在重新使用之前重新創建。這也意味着 單個準備好的語句不能被多個同時使用的數據庫客戶端使用;但是,每個客戶可以自行創建自己編寫的 聲明以供使用。

我只是想確保我理解這個權利,因爲對於數據庫來說,實現某種通用執行預處理語句的公共池似乎非常基本。

如果PostgreSQL不緩存這些,這將意味着每一個期待了很多數據庫事務需要制定某種事先準備好的聲明池中的所有連接,可重複使用的應用程序。

如果您之前曾使用過PostgreSQL,我將不勝感激。

+2

你實際上並沒有使用真正的(我的意思是*真* *)古代版本** 7.3 **的手冊供您參考,是嗎? – 2012-07-26 18:37:57

+1

版本7.3在2002年11月問世。如今完全過時和無用。你最好採用版本9。1或9.2(發佈日期爲2012年9月),以學習支持PostgreSQL的最新產品發佈。 – 2012-07-27 04:44:04

回答

4

是的,你的理解是正確的。通常情況下,如果您有一組重要的準備好的查詢,那麼您可以讓應用程序調用一個自定義函數來設置它們的連接。

有此AFAIK三個重要原因:

  1. 還有很長的待辦事項列表,他們得到完成時,開發商有興趣/支付解決這些問題。據推測,沒有人認爲它值得資助,或想出一個有效的方式來做到這一點。

  2. PostgreSQL的運行環境比Oracle更廣泛。我猜測99%的已安裝系統從中看不到太多的好處。有很多沒有高交易性能要求的設置,或者DBA注意是否需要。

  3. 計劃的查詢並不總是提供勝利。在延遲計劃/無效緩存方面做了大量工作,以儘可能地提供實際數據和查詢參數。

我懷疑最好的地方加入這樣的事情會在連接池(pgbouncer/pgpool),但我查了這樣的功能是不存在上一次的一個。

HTH

+0

優秀的回覆。我會補充說,試圖像oracle一樣對待postgresql或像oracle一樣思考它會經常導致你很多麻煩。 Postgres不是Oracle,而且常常以不同的方式做事。例如在一個大型的內存機器上,postgresql最好使用幾GB的較小shared_buffers,並讓內核使用內存的其餘部分進行緩存,這與Oracle的操作方式相反。 – 2012-07-27 13:46:29

+0

這是不正確的,PostgresSQL JDBC確實使用服務器端預處理語句(5次後自動使用):http://jdbc.postgresql.org/documentation/81/server-prepare.html – eckes 2014-10-09 00:52:52

+0

@eckes - 我不認爲你我已經正確地閱讀了這個問題。海報並不是問是否存在準備好的查詢,而是後端之間是否共享。他們不是。 – 2014-10-09 09:00:43