我的一张视图 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;
/
我用这句: 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;
/
你可以查出所有行做个对比或者直接用sqlplus命令行查询做对比
2、把这些表数据备份。
3、 truncate table table_name; table_name 是那个视图用到的表。
4、往这些表导入备份的数据
5、执行select count(*) 的查询语句, 应该会快了。select count(1) 更好,但是效率相差不大
至于企图通过count(1)提高速度的,都是愚蠢的想法。 *在这里仅仅是一个站位符,是关键字而已.
sql>set serveroutput on
sql>set autotrace on
您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
http://www.bestdba.cn/match_discussion3.aspx?pointid=492&pointid2=1&pointid3=5&pcount=stc非常感谢您对本次活动的支持!
--------------------------------------------------------------
用这句: 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 你看到了多少条记录?
用这句: 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(*) 更慢了,应该还是函数的问题!
然后在进行count操作的,所以速度是比较慢了.
此外,项目的开发中是不允许用count(*)的,尽量写成count(字段名)比较好,
尤其是字段名是主键的话,效率会更高
你写select * 时,实际上并没有把所有满足条件的数据行都查出来,而是一部分,因为数据量太大,可能把所有数据都查出来,就是查出来,你的电脑也缓存不了这么都数据!而你写 select count(*) 则需要把所有符合条件的行遍历一边才能得到结果!提高速度的办法: 建立索引!