消除无关列

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

相关推荐
随风飘的云1 天前
MySQL的慢查询优化解决思路
数据库
IvorySQL1 天前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师1 天前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
随逸1771 天前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头1 天前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
IvorySQL2 天前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData2 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
IvorySQL2 天前
PostgreSQL 技术日报 (3月5日)|规划器控制力升级,内核能力再进阶
数据库·postgresql·开源
数据组小组3 天前
免费数据库管理工具深度横评:NineData 社区版、Bytebase 社区版、Archery,2026 年开发者该选哪个?
数据库·测试·数据库管理工具·数据复制·迁移工具·ninedata社区版·naivicat平替