4-查詢資料總量-where和having子句的使用以及使用內部函式提速

安佰勝發表於2010-10-20


查詢資料總量-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部落格 ” ,連結:http://blog.itpub.net/13177610/viewspace-676339/,如需轉載,請註明出處,否則將追究法律責任。

相關文章