【发布时间】:2014-11-14 02:39:51
【问题描述】:
(我的环境:Windows 7 x64 和 Server 2008,EclipseLink 2.5.2,我已经使用 JTDS 和 MS JDBC 驱动程序以及 MS SQL Server Express 2008 和 2012 进行了以下尝试。)
我正在对包含 5 到 5000 万行的表进行分页查询,其中大约 500 万行符合过滤条件。以下是我用来在 UI 中一次显示 25 行数据的分页查询。分页工作正常 - 该列表每页仅包含 25 行。但是,查询需要 24 秒才能返回 25 行,这似乎很长。
我的目标是记录生成的 SQL,这样我就可以确切地看到 JPA 在 SQL Server 2008 和 2012 中是如何完成分页的。但是生成的 SQL 不包含与分页有关的任何内容,这让我想知道还有什么我在生成的 SQL 中没有看到。
查询:
CriteriaBuilder cb = JPA.em().getCriteriaBuilder();
CriteriaQuery<RGHICarrierPull> cq = cb.createQuery(RGHICarrierPull.class);
Root<RGHICarrierPull> from = cq.from(RGHICarrierPull.class);
CriteriaQuery<RGHICarrierPull> select = cq.select(from);
// Add filter/sort predicates to "predicates"
...
select.where(predicates);
// Apply pagination
records.setFirstResult((page-1)*limit);
records.setMaxResults(limit);
// Get data
List<RGHICarrierPull> lst = records.getResultList();
以编程方式记录生成的 SQL:
// Log the sql for this query
Session session = JPA.em().unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)records).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
System.out.println(databaseQuery.getSQLString());
记录的 SQL:
SELECT t1.SHIPTO_ZIP, t1.WHSE, t1.ANYNBR1, t1.ANYTEXT1, t1.CREATE_DATE_TIME, t1.
MOD_DATE_TIME, t1.PULL_TIME, t1.PULL_TIME_AMPM, t1.PULL_TRLR_CODE, t1.USER_ID,
1.SHIP_VIA FROM Ship_Via t0, RGHI_Carrier_Pull t1 WHERE ((t1.WHSE = 'WHSE1') AND
(t0.SHIP_VIA = t1.SHIP_VIA)) ORDER BY t0.SHIP_VIA ASC, t1.SHIPTO_ZIP ASC
显然,这不是一个分页查询,所以如果我直接运行这个查询,它会运行超过一分钟并返回所有 500 万行。如果我使用 persistence.xml 设置来记录所有 JPA 查询,并且如果我从 MS SQL Server 记录 SQL,我会得到相同的结果。
这是实际生成的 SQL 吗?我看到了两种可能性:
- 这是完整生成的 SQL,但 EclipseLink 正在执行其他操作来完成分页。
- EclipseLink 在添加分页内容之前记录此生成的 SQL
【问题讨论】:
标签: sql-server jpa pagination eclipselink offset