最近遇到一个很奇怪的的问题。
在一个表中,大概10万条数据,select count(*) from my_table like '%月亮%'
竟然需要8秒钟的样子。
奇怪的是,在另外一个测试环境中(我认为两个环境都相同),执行时间不到1秒都快疯了,各位达达能帮忙么?
不胜感激!

解决方案 »

  1.   

    在用时8秒钟的数据库中执行这句话SQL>CREATE TABLE test_my_table
    SQL> AS SELECT * FROM my_tab;然后再测试SQL>select count(*) from test_my_table like '%月亮%';看看用了多长时间
      

  2.   

    在用时8秒钟的数据库中执行这句话
    alter system flush shared_pool;
    然后再执行看看。
      

  3.   

    查看执行计划,是否两个环境不一样。
    估计使用8秒是全表扫描,可以试试以下:
    select /*+ rule */count(*) from my_table where col_name like '%月亮%'
      

  4.   

    alter shared_pool 
    的方法貌似没有用
      

  5.   

    执行计划是完全一样的。环境也没有发现什么异常这样使用like 肯定是全表扫描,但是不会两个库时间效率差这么多啊
      

  6.   

    可能是由于High Water Mark过大所致,就是说以前插入了太多的数据,然后又删除了,导致High Water Mark过大,Oracle在执行全表扫描时要全部处理。
      

  7.   

    select count(*)
    具体的查询过程是把“*”全部解析为表的列名,然后再集计
    然而,select count(列名)
    不用解析,直接集计得
      

  8.   

    select count(1) from TalbeName
      

  9.   

    like  属于全盘扫描,不慢才怪啊呵呵
      

  10.   

    你如果就是想要个count值,那么在查询的时候最好不要用*,这个*很占用资源的,你直接
    select count(主键) from table_name  这样最好,如果没有主键,比如ID这样的,那么至少也要查询已经带索引的列,你试过就知道了,速度和给数据库带来的影响是完全不同的!
      

  11.   

    zcs_1(生生不息) 厉害,牛,佩服