簡體   English   中英

有沒有一種方法可以強制在PostgreSQL中重新編寫JDBC預處理語句?

[英]Is there a way to force a JDBC prepared statement to re-prepare in Postgresql?

我已經審查了類似的問題, 請參閱並清除Postgres緩存/緩沖區? ,但是所有答案都集中在數據緩沖區上,自2010年以來,PostgreSQL發生了很大變化。

與該問題的OP不同,我在計算性能時不是在尋找一致的行為,而是在數據庫隨時間變化時在尋找自適應行為。

在我的應用程序中,在執行作業開始時,工作表中的行為空。 查詢運行非常快,但是隨着時間的流逝性能會下降,因為准備好的語句沒有使用理想的訪問路徑(它們是在表為空時准備的-doh!)。 由於典型的工作執行最終將覆蓋幾億行,因此我需要最小化所有開銷並定期運行統計信息以獲得最佳訪問路徑。

在SQLServer中,可以定期調用update statisticsDBCC FreeProccache ,並且准備好的語句將自動重新准備以使用新的訪問路徑。

編輯: FreeProcCache :在SQLServer中,准備好的語句作為存儲過程實現。 FreeProcCache會擦除已編譯的存儲過程,以便在下次調用時重新編譯它們,並且新的訪問路徑會立即生效。

編輯: 准備好的語句的 Postgresql 管理的詳細信息 :Postgresql將prepare推遲到對EXECUTE的第一次調用之前,並在第5次執行后緩存prepare的結果。 緩存后,將固定計划,直到會話結束或使用DEALLOCATE釋放准備好的語句。 關閉JDBC對象不會調用DEALLOCATE ,這是一種優化方法,可以像許多Web應用程序一樣支持打開/讀取/關閉編程。

有沒有一種方法可以在運行ANALYZE之后強制(編輯) JDBC准備的語句重新編譯(編輯),因此它將使用最新的統計信息?

編輯:我正在使用JDBC PreparedStatement來准備和執行針對數據庫和Postgres JDBC驅動程序的查詢。

Postgresql更新統計信息的方式是通過ANALYZE 這在VACUUM運行后也會自動執行(因為VACUUM釋放引用並截斷空頁面,所以我想像您的FreeProccache )。

如果啟用了自動真空 (默認),則將根據自動真空節奏自動運行ANALYZE。

在大多數情況下,您不需要“重新編譯”准備好的語句來獲取新的統計信息,因為它將在每個EXECUTE期間重新計划,而參數化的准備好的語句將基於參數值和更新的統計信息進行重新計划。 編輯:邊緣情況描述在這里查詢規划已決定,因為經過5計划-執行的特定計划的估計成本超過這樣的“一般的計划”的成本來強制一個“通用方案”。

編輯:如果你達到這個邊緣的情況下,你可以通過“降”預處理語句DEALLOCATE (然后再PREPARE )。

您可能想在執行之前嘗試進行ANALYZE,但這不能保證更好的性能。

  1. 請確保您確實要重新准備對帳單。 您可能只是想不時關閉數據庫連接,這樣語句才能“從頭開始”准備

  2. 如果您真的了解自己在做什么(可能有您所描述的有效原因),則可以發出DEALLOCATE ALL語句(這是PostgreSQL特定的語句,用於釋放所有准備好的語句)。 pgjdbc的最新版本(自9.4.1210,2016-09-07起)可以很好地處理並在以后使用時重新准備語句

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM