我的一张视图 VIEW_XSCJB,一共是7000多条记录。
我用这句: select * from view_xscjb where jd>=3.7 and jd<=4  用时一秒不到
当我加上count: select count(*) from view_xscjb where jd>=3.7 and jd<=4  用时要一分多钟
我的视图表里jd字段是number型的,换成select count(*) from view_xscjb where jd>=to_number(3.7) and jd<=to_number(4) 也是不行。
虚心请问高手这是什么原因,如何改进,谢谢。附:视图创建的时候用到唯一一个函数
CREATE OR REPLACE function get_jd(v_cjlx varchar2,v_cj number) return number is
  Result number;  
begin
    if v_cjlx='1' then 
    if v_cj<60 then 
  Result:=0 ;
else
   SELECT MC into Result FROM TJ_DAIMA t1 WHERE SSL='jd' AND dm = (
  select mcr from tj_daima t2 where ssl='bfz2jd' and mc=(select dm from tj_daima where ssl='bfz' and mc=to_char(trunc(v_cj)))
);    
end if; 
  end if;
    if v_cjlx='2' then 
    SELECT MC into Result FROM TJ_DAIMA t1 WHERE SSL='jd' AND dm = (select mcr from tj_daima t2 where ssl='ywdjz2jd' and mc=to_char(v_cj));
  end if;
  
  if v_cjlx='4' then 
    SELECT MC into Result FROM TJ_DAIMA t1 WHERE SSL='jd' AND dm = (select mcr from tj_daima t2 where ssl='ejz2jd' and mc=to_char(v_cj));
  end if;
  
  return(Result);
end get_jd;
/

解决方案 »

  1.   

    select count(1) from view_xscjb where jd>=3.7 and jd<=4
      

  2.   

    关键是要看你的view是怎么建的~你 select * from view_xscjb ; 要多少时间~ 我想也差不多4分钟吧
      

  3.   

    如果你用了plsql developer工具,该查询可能采用了CBO的first rows,当不加count时前n行可以优先返回结果,其他行仍然在查询中,当加count时必须扫描所有行才能得到count值
    你可以查出所有行做个对比或者直接用sqlplus命令行查询做对比
      

  4.   

    1、给出视图 VIEW_XSCJB的脚本,把该视图用到的表记录下来
    2、把这些表数据备份。
    3、 truncate table  table_name; table_name 是那个视图用到的表。
    4、往这些表导入备份的数据
    5、执行select count(*) 的查询语句, 应该会快了。select count(1) 更好,但是效率相差不大
      

  5.   

    来晚了,一般用count(1)能提高速度
      

  6.   

    执行执行计划你就知道是什么原因了. count(*)还是count(1) 都是一样的,需要增加有关排序的过程。
       至于企图通过count(1)提高速度的,都是愚蠢的想法。 *在这里仅仅是一个站位符,是关键字而已.
      

  7.   

    在sqlplus中 
      sql>set serveroutput on
      sql>set autotrace on
      
      

  8.   

    count(*)还是count(1) 都是一样的????
      

  9.   

    --------------------------------------------------------------
    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=492&pointid2=1&pointid3=5&pcount=stc非常感谢您对本次活动的支持!
    --------------------------------------------------------------
      

  10.   

    一张视图 VIEW_XSCJB,一共是7000多条记录。
    用这句: select * from view_xscjb where jd>=3.7 and jd<=4  用时一秒不到
    当我加上count: select count(*) from view_xscjb where jd>=3.7 and jd<=4  用时要一分多钟请问:select * from view_xscjb where jd>=3.7 and jd<=4 你看到了多少条记录?
      

  11.   

    请教各位专家,我也遇到类似的问题。从一个表和一个union结果的视图连接,查询非常,可以说,几乎出不来结果。奇怪的是,有时候就很快出结果,有时候就根本出不来。oracle还会报“出现系统错误,请与Oracle Support Services联系以寻求帮助。”
      

  12.   

    一张视图 VIEW_XSCJB,一共是7000多条记录。
    用这句: select * from view_xscjb where jd>=3.7 and jd<=4  用时一秒不到
    当我加上count: select count(*) from view_xscjb where jd>=3.7 and jd<=4  用时要一分多钟请问:select * from view_xscjb where jd>=3.7 and jd<=4 你看到了多少条记录?对呀!你看到的可能只是几条记录而已,全部显示可参就比count(*) 更慢了,应该还是函数的问题!
      

  13.   

    oracle的count(*),应该是先把"*"解析成所有的字段名,
    然后在进行count操作的,所以速度是比较慢了.
    此外,项目的开发中是不允许用count(*)的,尽量写成count(字段名)比较好,
    尤其是字段名是主键的话,效率会更高
      

  14.   

    终极答案:
    你写select * 时,实际上并没有把所有满足条件的数据行都查出来,而是一部分,因为数据量太大,可能把所有数据都查出来,就是查出来,你的电脑也缓存不了这么都数据!而你写 select count(*) 则需要把所有符合条件的行遍历一边才能得到结果!提高速度的办法: 建立索引!
      

  15.   

    使用autotrace分析一下吧,看看执行计划