我在JpaRepository
中有如下查询。
我的Pageable
大小为1000条记录,但HINT_FETCH_SIZE
的大小为50条记录。
这是否意味着要填充1000条记录中的Page
,此查询被称为20次(20 x提取大小50)?
我的理解正确吗?
如果我们需要HINT_FETCH_SIZE
的1000条记录,那么理想的Pageable
是什么?
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "50"))
@Query("SELECT m FROM sales m " +
"WHERE m.settlementDate >= :start " +
"AND m.settlementDate < :end " +
"ORDER BY m.salesId")
Page<Sales> findBySettlementDatePage(
@Param("start") LocalDate start,
@Param("end") LocalDate end,
Pageable pageable);
答案 0 :(得分:1)
这是否意味着要填充1000条记录的页面,此查询被称为20次(20 x提取大小50)?
不。
每页只执行一次查询。
提取大小决定了在等待客户端发出信号表示数据库已处理完所有行之前,数据库应立即发送多少行,这是通过访问ResultSet
中的所有行自动发生的,而当访问{ JPA实施将结果转换为List
或类似的结果。
当并非所有行都适合内存时,这特别有用。 因此,这种说法并不重要。
数据库可能要做的另一件事是针对指定的访存大小优化查询计划。 这意味着它会尝试尽可能快地将前n行带给您,即使这样做可能会花费更长的时间来获取所有行。
由于您必须先填充Page
对象,然后才能继续执行程序,因此您希望获取的大小如此之大,以至于一次性可以获取单个页面的所有数据。
对于简单实体,这可能恰好是Page
中的行数。
但是,如果该实体急切地获取一对多关系,则它实际上可能会进行联接并获取多于1000行的方式。
到目前为止,理论。 实际上,您不应该指定获取大小,而应将其留给数据库驱动程序。 而且只有当您看到问题(或有充分理由希望解决一些问题)时,才应实际尝试使用不同的访存大小,以查看方案的最佳价值在哪里。