我有这个非常大的桌子,每天有数百万条记录,每天结束时我都会提取前一天的所有记录.我这样做:
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数据库驱动程序执行查询时只显示几行,当你向下滚动时会显示更多结果?
我想直接通过Spark控制RDB的读写速度,但是标题已经显示的相关参数似乎不起作用。
我可以得出结论,fetchsize并且batchsize不能使用我的测试方法吗?或者它们确实影响阅读和写作的方面,因为基于规模的衡量结果是合理的。
betchsize,fetchsize数据和设置/*Dataset*/
+--------------+-----------+
| Observations | Dataframe |
+--------------+-----------+
| 109,077 | Initial |
| 345,732 | Ultimate |
+--------------+-----------+
/*fetchsize*/
+-----------+-----------+------------------+------------------+
| fetchsize | batchsize | Reading Time(ms) | Writing Time(ms) |
+-----------+-----------+------------------+------------------+
| 10 | 10 | 2,103 | 38,428 |
| 100 | 10 | 2,123 | 38,021 |
| 1,000 | 10 | 2,032 | 38,345 |
| 10,000 | 10 | 2,016 | …Run Code Online (Sandbox Code Playgroud) 我们使用 Apache Spark 每 2 小时执行一次 ETL。
有时Spark在执行读/写操作时会给数据库带来很大的压力。
对于Spark Streaming,我可以backpressure在kafka上看到配置。
有没有办法在批处理中处理这个问题?