完全hibernate小白,第一次使用,频繁使用“select count(*) from Item where id=xx”语句,但效率很低。我的业务需要我统计当前符合条件的条目的数量。我方法如下query= session.createQuery(“select count(*) from Item where id=xx”) ;int sum=Integer.parseInt(query.list().get(0).toString());效率好低,我觉得好像方法转来转去的也不科学,感觉好蠢呐,哪位大大有比较高效一点的方法吗?

解决方案 »

  1.   

    如果你的条件是用主键来完成的,那可以使用二级缓存,或者你可以参考hibernate上面所介绍的方法.
    ( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue(),这样就不用返回整个集合,
      

  2.   

    sql本身没法在优化了吧  可以从数据库层面去优化  你如加索引 分区表等
      

  3.   

    我给你优化点吧...select count(id) from Item where id=xxid 最好能是主键,不是的话看情况加索引。
      

  4.   

    select count(1) from xxx where xxx.id = xxxxx.count(1)比*要快一些的
      

  5.   


    视图不是预编译的sql。。view在查询的时候,还是会执行一遍里面的select语句
    create view v_test select count(1) from ...
    效率没有提高,只是操作起来方便了。况且这里的查询sql还需要传递一个参数,需要返回一个值,用的话也是用function了。。
      

  6.   

    数据库优化就那么几点
    1、使用索引,频繁查询字段需要建立索引,而且字段数据没有包含NULL。
    2、查询语句不存在变动,这样数据库就不会重复解析sql来影响查询速度:
    例如select * from table t where id=xx;与select * from table t where id=?; xxx.setInt(xx);
    第一个xx这个值不断变动,影响语句变动,sql对每个不同的值都要完成语句编译,造成查询速度下降,后一种的?不会变动,值由api注入进去,因此语句不会变动,sql调用不会重复编译语句。
    3、不要使用跑背离索引的查询,例如not查询 包含null的查询 like '%xxx%'这样的查询,同样尽量也不要使用函数。
    4、查询尽量不要使用抽取所有值的查询,尽量有where字句来使用索引。
    5、in语句中不要包含子查询,如果需要使用exists子查询。
    6、查询尽量使用简单值,不要使用复杂数值或者函数。例如select count(1)from table就会比select count(*) from table快一点。