2017-03-01 87 views
0

我們在Postgres數據庫中有一張表,其中列出了兩個整數,例如i1,i2和一個double,例如d。獲取Postgres表中的所有行

由於某些原因,我們需要此表中所有行中的這些字段的所有值。另外,我們需要使用Java來做到這一點,不要問我爲什麼。

我正試圖看到這樣做的最有效的方式。當然,我可以用查詢執行Java語句

SELECT i1, i2, d FROM mytable; 

然後遍歷ResultSet。我擔心這可能會給DB帶來負擔。

該表可能包含數百萬行(絕對小於10米),我們只對這三個領域感興趣。

如果有一個單列主鍵,我可以很容易地編寫一個光標指示的呼叫,像這樣

SELECT i1, i2, d FROM mytable where primarykey > ?; 

但表沒有單列主鍵。

雖然i1和i2保證是唯一的,但表格沒有索引,並且考慮到這只是一次性活動,所以團隊中的任何人都不可能有興趣創建一個。

如果沒有索引,我懷疑選擇所有的行實際上會比通過i1和i2訂購便宜,然後使用這些來編寫一個光標調用。

這樣做的最有效和最不成問題的方法是什麼?

+0

你有節目的select語句是做到這一點的唯一方法。但是,您可能希望將驅動程序配置爲使用遊標獲取結果:https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor –

+0

您可以通過創建索引來「準備」數據在這3個字段 - 這種方式選擇將只掃描索引,但它只會使你常常只掃描那3列,額外的索引是可以承受的。 –

+0

嗨,沒有單列主鍵,而i1和i2保證是獨特,沒有指標。用這個描述更新了文章。很抱歉,在寫原創描述時忘記了。 – D159

回答

0

只需運行select來獲取所有行。 Postgres絕對可以處理。

退出任何order by使處理成本更低。

您應該唯一關心的是驅動程序的內存消耗。默認情況下,在從executeQuery()調用返回之前,Postgres驅動程序在內存中緩衝全部行。

您可能需要將驅動程序配置爲不這樣做。這是覆蓋在駕駛員手冊:

https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor

+0

快速跟進問題 - 這是否適用於PreparedStatement?即這會限制PreparedStatement Query的讀取大小嗎? – D159

+0

@ D159它也可以和'PreparedStatement'一起工作(如果沒有的話,它也沒什麼意義) –