消除无关列

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 *消耗不必要的性能。

相关推荐
忧郁的橙子.10 小时前
深入浅出etcd与Raft:从核心组件到数据一致性原理
数据库·etcd
鱼鳞_10 小时前
热门八股-MySQL
数据库·mysql
小尘要自信10 小时前
软件远控失效以后怎么办?玩客云 + One-KVM 实现 BIOS 级远程画面与键鼠控制
服务器·网络·数据库
这个DBA有点耶10 小时前
数据库“家谱”系列之一:关系型数据库的4大核心组件详解
数据库·mysql·架构
ClouGence10 小时前
数据库迁移同步工具 CloudCanal v6.4.0.0 发布,Oracle、SAP Hana 等同步能力再升级
数据库
ClouGence10 小时前
2026 数据库 CI/CD 工具大盘点:4 款热门工具怎么选?
数据库·后端·ci/cd
云和恩墨10 小时前
云和恩墨亮相2026数博会,与超聚变联合呈现“算力+数据”一体化管理方案
数据库
ClouGence11 小时前
数据库 CI/CD 再升级:CloudDM 4.1.0 支持多数据库发布流编排
数据库·sql·ci/cd
SelectDB11 小时前
为什么越来越多分析数据库开始重视实时更新,而不仅仅是查询性能?
大数据·数据库·数据分析
SelectDB11 小时前
为什么今天值得重新比较 Apache Doris 和 StarRocks?
大数据·数据库·数据分析