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在处理这样的查询上又什么特殊要注意的地方吗?