2015-06-09 73 views
4

在JDBC中,默認提取大小爲10,但我猜這不是具有一百萬行的最佳提取大小。我知道提取大小太低會降低性能,但是如果提取大小太高。如何找出選擇查詢的最佳提取大小

如何找到最佳尺寸?這是否會影響數據庫方面,是否會咀嚼大量內存?

+0

它不會咀嚼任何內存。 Oracle使用生產者 - 消費者設計模式,以便根據請求生成結果行(當您調用fetch時)。設置提取大小應該減少數據庫和應用程序之間的往返次數。我不確定JDBC,但至少在OCI中,您還可以以字節(兆字節)來指定接收緩衝區的大小。 – ibre5041

+0

默認值爲[zero](http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setFetchSize(int))。 – EJP

+0

這裏它說:「默認情況下,當Oracle JDBC執行查詢時,它從數據庫光標中一次收到10行結果集。」 「http://docs.oracle.com/cd/A87860_01/doc/java .817/a83724/resltse5.htm – KKO

回答

8

與(幾乎)任何東西一樣,找到特定參數的最佳大小的方法是將您嘗試優化的工作負載與參數的不同值進行基準比較。在這種情況下,您需要使用不同的獲取大小設置來運行代碼,評估結果並選擇最佳設置。

在絕大多數情況下,人們選擇一個100或1000的抓取大小,結果是一個合理的最佳設置。在這一點上的性能差異通常非常小 - 您會預期大多數運行之間的性能差異是正常隨機變化的結果,而不是由獲取大小的變化引起的。如果您想要在特定配置中獲得特定工作負載的最後性能,您當然可以進行分析。但對於大多數人來說,100或1000就足夠了。

8

如果您的行很大,那麼請記住,您一次讀取的所有行都必須存儲在驅動程序內部緩衝區中的Java堆中。在12c中,Oracle具有VARCHAR(32k)列,如果您有50個列,並且它們已滿,那麼每行就有1,600,000個字符。每個字符在Java中是2個字節。所以每行最多可能需要3.2MB。如果您將行100取100,那麼您將需要320MB的堆來存儲數據,這只是一個Statement。所以,您應該只增加行取預取大小,以獲取合理的小行(數據量小)的查詢。

0

JDBC確實有10退房 OracleConnection.getDefaultRowPrefetch的缺省預取大小在JDBC Javadoc

3

JDBC的缺省值獲取大小屬性是特定驅動器和Oracle驅動程序是10確實。

對於某些查詢,提取大小應該較大,對於一些較小的查詢。

我覺得是個好主意是設置一些全球對整個項目的獲取大小和覆蓋它的一些單個查詢它應該更大。

看看這篇文章:

http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html

有關於如何建立全球範圍內獲取大小和覆蓋它使用不同的方法精心挑選的查詢說明:休眠,JPA,春天JDBC模板或核心的JDBC API。還有一些簡單的基準,用於oracle數據庫。

作爲一個經驗法則,您可以:

  • 集FETCHSIZE到50 - 設置100全球
  • 集FETCHSIZE到100 - 500(甚至更多)的單個查詢