簡體   English   中英

postgresql查詢的大ResultSet

[英]Large ResultSet on postgresql query

我正在對postgresql數據庫中的表運行查詢。 數據庫位於遠程計算機上。 該表包含大約30個使用postgresql 分區功能的子表。

查詢將返回一個大的結果集,大約180萬行。

在我的代碼中,我使用spring jdbc支持,方法JdbcTemplate.query ,但我的RowCallbackHandler沒有被調用。

我最好的猜測是postgresql jdbc驅動程序(我使用版本8.3-603.jdbc4)在調用我的代碼之前將結果累積在內存中。 我認為fetchSize配置可以控制它,但我嘗試了它,沒有任何改變。 我做了這個postgresql手冊推薦

當我使用Oracle XE時,此查詢工作正常。 但是我正在嘗試遷移到postgresql,因為分區功能在Oracle XE中不可用。

我的環境:

  • Postgresql 8.3
  • Windows Server 2008 Enterprise 64位
  • JRE 1.6 64位
  • 春天2.5.6
  • Postgresql JDBC Driver 8.3-603

要使用游標檢索數據,除了設置提取大小外,還必須將ResultSet類型設置為ResultSet.TYPE_FORWARD_ONLY(默認值)並自動提交為false。 這是在您鏈接到的文檔中引用的,但您沒有明確提到您執行了這些步驟。

注意PostgreSQL的分區方案。 它確實與優化器一起發生了非常可怕的事情,並且可能導致大量性能問題,而不應該存在(取決於您的數據的具體情況)。 無論如何,你的行只有1.8M行嗎? 沒有理由需要根據大小單獨進行分區,因為它已被適當地編入索引。

我打賭你的應用程序中沒有一個客戶端同時需要1.8M行。 你應該想出一種合理的方法,將結果分成更小的部分,並讓用戶有機會迭代它們。

這就是谷歌所做的。 當您進行搜索時,可能會有數百萬次點擊,但它們一次返回25頁,並且您可以在第一頁中找到所需內容。

如果它不是客戶端,並且結果正在以某種方式進行按摩,我建議讓數據庫處理所有這些行並簡單地返回結果。 返回1.8M行只是為了在中間層上進行計算是沒有意義的。

如果這些都不適用,那你就有了一個真正的問題。 是時候重新考慮一下了。

在閱讀了后面的回復之后,我覺得這更像是一種報告解決方案,應該是批量處理或實時計算並存儲在不屬於交易系統的表中。 沒有辦法將1.8M行帶到中間層來計算移動平均線可以擴展。

我建議自己重新定位 - 開始考慮將其作為報告解決方案。

fetchSize屬性的工作方式與postgres手冊中描述的相同。

我的錯誤是我將auto commit = false設置為來自連接池的連接,該連接池不是預准備語句使用的連接。

感謝所有的反饋。

我做了以上所有事情,但我需要最后一件事:確保調用包含在事務中並將事務設置為只讀,因此不需要回滾狀態。

我添加了這個: @Transactional(readOnly = true)

干杯。

暫無
暫無

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

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