我正在对Hive运行查询。相同的查询应该与其他JDBC驱动程序一起使用,这意味着其他关系数据库。
我无法使用Statement.setFetchSize方法,因为Hive JDBC 0.13.0不支持它。
我正在努力解决这个问题,因此,我采用了另一种类似的方法: Statement.setMaxRows
我应该在哪些情况下使用Statement.setMaxRows vs Statement.setFetchsize?
是否可以互换使用?
感谢。
答案 0 :(得分:8)
不,你不能互换使用它们。他们做不同的事情。 setMaxRows =可以整体返回的行数。 setFetchSize =将在每个数据库往返中返回的数字,即
setFetchSize给JDBC驱动程序一个提示 更多行时应从数据库中提取的行数 需要由此Statement生成的ResultSet对象。
setMaxRows设置最大行数限制 此Statement对象生成的任何ResultSet对象都可以 包含给定的数字。
事实上,由于setFetchSize是一个提示,驱动程序可以自由地忽略它并执行它认为合适的操作。所以不要担心Hive JDBC不支持这个。
请注意,setMaxRows正在执行的是
减小ResultSet对象的大小。它不会影响速度 的查询。 setMaxRows不会改变实际的SQL - 使用 top / limit / rownum例如 - 所以它不会改变数据库所做的工作。该 如果有更多,查询将返回比您的限制更多的结果 返回结果,然后截断它们以适合您的ResultSet。
This answer很好地解释了setFetchSize的重要性:
对于JVM中的性能和内存管理非常重要 它控制从JVM到数据库的网络调用数 以及相应地用于ResultSet处理的RAM量。
<小时/> Btw ,可以在java.sql.Statement和java.sql.ResultSet上设置setFetchSize。默认值由创建结果集的Statement对象设置。可以随时更改提取大小。而Hive JDBC拥有它自己的HiveQueryResultSet with a setFetchSize method。