有没有人知道如何优化此查询以便它能够更快地运行?现在需要30秒来检索大约3k的"容器"这就是长篇大论......预计它必须找回大约1万亿的记录。
Query query = em().createNativeQuery("SELECT * FROM CONTAINER where TO_CHAR(CREATION_DATE, 'YYYY-MM-DD') >= TO_CHAR(:from, 'YYYY-MM-DD') " +
"AND TO_CHAR(CREATION_DATE, 'YYYY-MM-DD') <= TO_CHAR(:to, 'YYYY-MM-DD') ", Container.class);
query.setParameter("from", from);
query.setParameter("to", to);
return query.getResultList();
JPA 2.0,Oracle DB
编辑:我在CREATION_DATE列上有一个索引:
CREATE INDEX IDX_CONTAINER_CREATION_DATE
ON CONTAINER (CREATION_DATE);
它不是命名查询,因为JPA 2.0似乎不支持TO_CHAR功能,而且我已经知道如果有索引它应该使查询更快..
我的解释计划(由于某种原因仍在进行全表扫描而不是使用索引):
---------------------------------------
| Id | Operation | Name |
---------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS FULL| CONTAINER |
---------------------------------------
我不喜欢的一个修复:
我做了以下事情......
TypedQuery<Container> query = em().createQuery(
"SELECT NEW Container(c.barcode, c.createdBy, c.creationDate, c.owner, c.sequence, c.containerSizeBarcode, c.a, c.b, c.c) " +
"FROM Container c where c.creationDate >= :from AND c.creationDate <= :to", Container.class);
我已经向Container添加了一个荒谬的长构造函数,这可以解决加载时间问题。但是,这真的太丑了,我不想要这个。还有其他任何建议吗?