lovetimiforever
lovetimiforever
2017-10-13 02:06

hibernate在查询oracle分区表效率慢

  • oracle
  • java
  • hibernate

hibernate在查询oracle分区表的时候效率很慢,有没有什么设置优化的方法,具体案例如下:
我有一张表 INVENTORY_LOG_BACKUP 按月份做了分区。数据大概在2千多万的样子。
我有一段简单的hibernate查询代码如下:
Query query = HibernateUtil.getCurrentSession().createSQLQuery(" select\n" +
" count(*) as y0_ \n" +
" from\n" +
" INVENTORY_LOG_BACKUP this_ \n" +
" where\n" +
" this_.CREATE_DATE>=:fromDate \n" +
" and this_.CREATE_DATE<=:toDate \n" +
" \n");
query.setParameter("fromDate",DateUtils.parseDate("20170701",DateUtils.YYYYMMDD));
query.setParameter("toDate",DateUtils.parseDate("20170720",DateUtils.YYYYMMDD));
BigDecimal cc = (BigDecimal) query.uniqueResult();

这段代码执行了68秒,才得到结果,

    Query query = HibernateUtil.getCurrentSession().createSQLQuery(" select\n" +
            "        count(*) as y0_ \n" +
            "    from\n" +
            "        INVENTORY_LOG_BACKUP this_ \n" +
            "    where\n" +
            "        this_.CREATE_DATE>=to_date('20170701','yyyymmdd') \n" +
            "        and this_.CREATE_DATE<= to_date('20170720','yyyymmdd')\n" +
            " \n");

    BigDecimal cc = (BigDecimal) query.uniqueResult();

这段代码执行花费了 4秒就得到结果

Criteria criteria = HibernateUtil.getCurrentSession().createCriteria(InventoryLogBackUp.class);
criteria.add(Restrictions.ge(InventoryLog.COL_CREATE_DATE,DateUtils.parseDate("20170701",DateUtils.YYYYMMDD)));
criteria.add(Restrictions.le(InventoryLog.COL_CREATE_DATE,DateUtils.parseDate("20170720",DateUtils.YYYYMMDD)));

//获取总行数
Long count = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();

使用Criteria查询也消耗了60多秒时间。
用sql在数据库里面查询也只要几秒就得到结果了。hibernate在处理这样的查询上又什么特殊要注意的地方吗?

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答

为你推荐

换一换