ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 4-查询数据总量-where和having子句的使用以及使用内部函数提速

4-查询数据总量-where和having子句的使用以及使用内部函数提速

原创 Linux操作系统 作者:安佰胜 时间:2010-10-20 10:29:27 0 删除 编辑


查询数据总量-where和having子句的使用以及使用内部函数提速

=====================

1、计算数据总量

有3种做法:

select count(1) from table_name;
select count(*) from table_name;
select count(字段) from table_name;

个人觉得count(索引过的字段)速度最快
count(*)其次
count(1)和count(未索引的字段)最慢

-----------------------

2、where子句与having子句

where子句可以限制以减少查询出来的数据量
而having子句则是在查询出来的数据基础上来进行过滤
所以最好使用where子句代替having子句

SQL> create table an(id int,name varchar2(50) default 'anbaisheng' not null);

表已创建。

SQL> begin
  2  for
  3  i in 1..10000 loop
  4  insert into an (id) values(i);
  5  end loop;
  6  commit;
  7  end;
  8  /

PL/SQL 过程已成功完成。

SQL> alter table an modify (name varchar2(50) default 'xiangxiang');

表已更改。

SQL> begin
  2  for
  3  i in 10001..20000 loop
  4  insert into an (id) values(i);
  5  end loop;
  6  commit;
  7  end;
  8  /

PL/SQL 过程已成功完成。

SQL> select count(*) from an;

  COUNT(*)
----------
     20000

SQL> set timing on
SQL> select count(*),name from an group by name having name='xiangxiang';

  COUNT(*) NAME
---------- --------------------------------------------------
     10000 xiangxiang

已用时间:  00: 00: 00.03
SQL> select count(*),name from an where name='xiangxiang' group by name;

  COUNT(*) NAME
---------- --------------------------------------------------
     10000 xiangxiang

已用时间:  00: 00: 00.01

效果还是很显著的

---------------------------------

通过内部函数提高sql效率

SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*)
FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H
WHERE H.EMPNO = E.EMPNO
AND H.HIST_TYPE = T.HIST_TYPE
GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC;


通过调用下面的函数可以提高效率.

FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2
AS
TDESC VARCHAR2(30);
CURSOR C1 IS
SELECT TYPE_DESC
FROM HISTORY_TYPE
WHERE HIST_TYPE = TYP;
BEGIN
OPEN C1;
FETCH C1 INTO TDESC;
CLOSE C1;
RETURN (NVL(TDESC,'?'));
END;


FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2
AS
ENAME VARCHAR2(30);
CURSOR C1 IS
SELECT ENAME
FROM EMP
WHERE EMPNO=EMP;
BEGIN
OPEN C1;
FETCH C1 INTO ENAME;
CLOSE C1;
RETURN (NVL(ENAME,'?'));
END;


SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO),
H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*)
FROM EMP_HISTORY H
GROUP BY H.EMPNO , H.HIST_TYPE;


<汗~~~~~麻烦>

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13177610/viewspace-676339/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-08-26

  • 博文量
    215
  • 访问量
    660355