消除无关列

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

相关推荐
Random Glow1 小时前
二级索引与回表:一次回表到底多贵
数据库·mysql·性能优化·innodb·索引
CarIise1 小时前
JDBC 与数据库事务核心
数据库·笔记
见闻小天地1 小时前
新手入门:印刷包装设备的伺服和PLC运动控制方案各管什么?七步选型讲清楚
运维·网络·数据库·人工智能
海鸥-w2 小时前
Redis 配置与排错说明
java·数据库·redis·bootstrap
jaysee-sjc2 小时前
【苍穹外卖】Day12:工作台数据看板与 Excel 报表导出
java·开发语言·数据库·spring boot·spring·微信·excel
sunburn-3 小时前
数据库聚合查询完整教程:从基础函数到实战统计
java·数据库·mysql·数据库开发
小蒜学长3 小时前
基于 Spring Boot 的英语单词背诵系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
中电金信3 小时前
开发更高效、监控更实时、运维更省心,源启数据开发平台构筑一站式数据开发新底座
网络·数据库·人工智能
泡海椒3 小时前
深度解析JQuick-SQL 谓词下推与投影下推优化机制
数据库·sql
❀͜͡傀儡师4 小时前
MySQL REST Service 认证鉴权体系与 MySQL 26.10.0 内置化演进
数据库·mysql·adb