我有这个非常大的桌子,每天有数百万条记录,每天结束时我都会提取前一天的所有记录.我这样做:
String SQL = "select col1, col2, coln from mytable where timecol = yesterday";
Statement.executeQuery(SQL);
Run Code Online (Sandbox Code Playgroud)
问题是这个程序需要2GB的内存,因为它会将所有结果都记在内存中然后处理它.
我尝试设置Statement.setFetchSize(10)但它从操作系统获取完全相同的内存它没有任何区别.我正在使用Microsoft SQL Server 2005 JDBC驱动程序.
有没有办法以小块的形式读取结果,比如Oracle数据库驱动程序执行查询时只显示几行,当你向下滚动时会显示更多结果?
我正在处理ResultSet从远程Microsoft SQL Server 2012到使用Microsoft JDBC Driver 4.0的Java客户端检索相对较大的性能问题.
当我在远程服务器的Microsoft SQL Server Management Studio上运行相应的查询时,它返回约.220k行几乎瞬间完成.当我从客户端发出相同的查询时,它会停止.同样的测试在客户端上运行良好,早期版本的数据库只有大约.400行合格.
我尝试通过附加;responseBuffering=adaptive"到传递给的URL 来解决这个问题DriverManager.getConnection().建立连接后,我在结果中看到了这个属性(以及其他几个)connection.getMetaData().getURL(),但是[ connection.getClientInfo(responseBuffering)返回null,而且客户端仍然停滞不前.
这里可能出现什么问题,如何指示Microsoft SQL Server(不仅仅是以Java编程方式建议)它必须以较小的块而不是一次性返回行,或者通过其他一些措施来改进JDBC查询时间.
两个进一步的观察似乎有点奇怪,可能完全指向不同的根本原因:
更新我已经检查过,发现在我的情况下切换PreparedStatement到Statement没有改善的东西(显然在其他情况下可以帮助).
更新这是我当前的查询:
select
PARENT.IDENTIFIER as PARENT_IDENTIFIER,
PARENT.CLASS as PARENT_CLASS,
CHILD.TYPE as CHILD_TYPE,
CHILD.IDENTIFIER as CHILD_IDENTIFIER,
PROPERTY.IDENTIFIER as PROPERTY_IDENTIFIER,
PROPERTY.DESCRIPTION as PROPERTY_DESCRIPTION,
PROPERTY.TYPE as PROPERTY_TYPE,
PROPERTY.PP as PROPERTY_PP,
PROPERTY.STATUS as PROPERTY_STATUS,
PROPERTY.TARGET as PROPERTY_TARGET -- a date
from …Run Code Online (Sandbox Code Playgroud)