[英]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中不可用。
我的環境:
要使用游標檢索數據,除了設置提取大小外,還必須將ResultSet類型設置為ResultSet.TYPE_FORWARD_ONLY(默認值)並自動提交為false。 這是在您鏈接到的文檔中引用的,但您沒有明確提到您執行了這些步驟。
注意PostgreSQL的分區方案。 它確實與優化器一起發生了非常可怕的事情,並且可能導致大量性能問題,而不應該存在(取決於您的數據的具體情況)。 無論如何,你的行只有1.8M行嗎? 沒有理由需要根據大小單獨進行分區,因為它已被適當地編入索引。
我打賭你的應用程序中沒有一個客戶端同時需要1.8M行。 你應該想出一種合理的方法,將結果分成更小的部分,並讓用戶有機會迭代它們。
這就是谷歌所做的。 當您進行搜索時,可能會有數百萬次點擊,但它們一次返回25頁,並且您可以在第一頁中找到所需內容。
如果它不是客戶端,並且結果正在以某種方式進行按摩,我建議讓數據庫處理所有這些行並簡單地返回結果。 返回1.8M行只是為了在中間層上進行計算是沒有意義的。
如果這些都不適用,那你就有了一個真正的問題。 是時候重新考慮一下了。
在閱讀了后面的回復之后,我覺得這更像是一種報告解決方案,應該是批量處理或實時計算並存儲在不屬於交易系統的表中。 沒有辦法將1.8M行帶到中間層來計算移動平均線可以擴展。
我建議自己重新定位 - 開始考慮將其作為報告解決方案。
我做了以上所有事情,但我需要最后一件事:確保調用包含在事務中並將事務設置為只讀,因此不需要回滾狀態。
我添加了這個: @Transactional(readOnly = true)
干杯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.