GBase 8a
性能调优
文章

GBase 8a 建表时把时间字段写成 VARCHAR,后面查询基本都会吃亏

发表于2026-03-20 09:46:3615次浏览3个评论

这类问题在线上特别常见。前期为了省事,很多表会把时间字段直接定义成字符串,像 VARCHAR(19)2026-03-19 10:00:00。刚开始看不出什么问题,等数据量大了,范围查询、分区过滤、统计分析都会越来越吃力。

比如下面这种写法:

 

select count(*)
from ods_event_info
where event_time >= '2026-03-01 00:00:00'
  and event_time < '2026-03-19 00:00:00';

 

如果 event_time 是字符串类型,数据库很多时候就没法像真正的时间类型那样高效处理,尤其在分区设计、范围过滤、表达式转换这些地方,代价会更大。

更合理的方式一般是直接用 DATEDATETIME

 

create table ods_event_info (
    event_id      bigint,
    user_id       bigint,
    event_time    datetime,
    event_type    varchar(50)
);

 

然后查询也尽量保持字段原样过滤,不要再额外套函数:

 

select count(*)
from ods_event_info
where event_time >= '2026-03-01 00:00:00'
  and event_time < '2026-03-19 00:00:00';

 

很多性能问题,最后查下来并不是 SQL 当场写错了,而是表结构从一开始就给后续查询埋了坑。
时间字段、金额字段、状态字段,这三类尤其容易出问题。时间用字符串、金额用浮点、状态用长文本,这几种设计后面都容易吃亏。

评论

登录后才可以发表评论
nodddddd发表于 4个月前
学到了
用户头像
山佳发表于 4个月前
学习了
爱笑的眼睛发表于 2个月前
三人行必有我师