【发布时间】:2019-11-20 19:49:51
【问题描述】:
我在 Oracle 数据库中有一个包含大量记录的表。假设表格如下所示:
+--------+----------+-------+--------+
| Column | Id | Value | Active |
+--------+----------+-------+--------+
| | 1 | 123 | Y |
| | 2 | 234 | Y |
| | 3 | 12345 | N |
| | 4 | 98765 | Y |
| | ... | ... | ... |
+--------+----------+-------+--------+
我想逐页获取 Active 标记为“Y”的记录,以便使用多个线程进行处理(每个线程 1 页)。
为此,我可以执行以下查询:
SELECT Value FROM MyTable WHERE Active = 'Y' OFFSET 1000 ROWS FETCH NEXT 1000 ROWS ONLY;
或者在Java中使用以下代码:
QMyTable myTable = QMyTable.myTable;
jpaQueryFactory.select(myTable.value)
.from(myTable)
.where(myTable.active.eq('Y'))
.offset(1000)
.limit(1000)
.fetch();
但是,此查询的性能会降低,因为数据库必须遍历所有以前的记录并丢弃超出范围的记录。
为了获得更好的性能,我可以使用以下查询:
SELECT Value FROM MyTable WHERE Active = 'Y' AND Id > 1000 FETCH NEXT 1000 ROWS ONLY;
Java:
QMyTable myTable = QMyTable.myTable;
jpaQueryFactory.select(myTable.value)
.from(myTable)
.where(myTable.active.eq('Y'))
.where(myTable.Id.gt(1000))
.limit(1000)
.fetch();
上面的代码可以工作,但性能仍然下降(第一页用了 0.1 秒,但在 3M 记录后用了 7 秒!)。我做错了吗?或者我可以使用其他任何方式来加快速度?
【问题讨论】:
标签: java database oracle querydsl