本机查询(JPA)需要很长时间与日期比较

时间:2016-07-15 09:02:13

标签: jpa

有没有人知道如何优化此查询以便它能够更快地运行?现在需要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添加了一个荒谬的长构造函数,这可以解决加载时间问题。但是,这真的太丑了,我不想要这个。还有其他任何建议吗?

0 个答案:

没有答案