1、背景
项目中做报表统计时,经常使用union al合并放到一个视图里,然而为了方便总是喜欢使用select * ,导致消耗不必要的性能。
2、问题
数据准备
css
drop table if exists t1;
create table t1 (id int primary key,c1 varchar2(2000),c2 varchar2(2000),c3 varchar2(2000),c4 varchar2(2000),
c5 varchar2(2000),c6 clob);
drop table if exists t2;
create table t2 (id int primary key,c1 varchar2(2000),c2 varchar2(2000),c3 varchar2(2000),c4 varchar2(2000),
c5 varchar2(2000),c6 clob);
insert into t1 select level,rpad('A',1900,'a'),rpad('B',1900,'B'),rpad('C',1900,'C'),rpad('D',1900,'D'),
rpad('E',1900,'E'),rpad('F',10000,'F') FROM DUAL CONNECT BY LEVEL<=20000;
commit;
DBMS_STATS.GATHER_TABLE_STATS(USER,'T1',NULL,100);
insert into t2 select level,rpad('A',1900,'a'),rpad('B',1900,'B'),rpad('C',1900,'C'),rpad('D',1900,'D'),
rpad('E',1900,'E'),rpad('F',10000,'F') FROM DUAL CONNECT BY LEVEL<=50000;
commit;
DBMS_STATS.GATHER_TABLE_STATS(USER,'T2',NULL,100);
为了便于报表统计,创建以下视图。
css
CREATE or replace VIEW ALL_T AS SELECT * FROM T1 UNION ALL SELECT * FROM T2 union all select * from t1 union all select * from t2;
问题语句
css
SELECT COUNT(1) FROM (select T.* from ALL_T T,ALL_T A WHERE T.ID=A.ID) AA
计划:

这里T.*,字节长度292,这里的select T.*是冗余的,直接查询select count(1)即可
3、改写
于是我们把select T.*去掉
css
SELECT COUNT(1) FROM ALL_T T,ALL_T A WHERE T.ID=A.ID
计划:

这里的字节长度为8,从原来的2.8s下降至0.191s

4、小结
好习惯的养成,要查询真实的列,避免select *消耗不必要的性能。