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 是字符串类型,数据库很多时候就没法像真正的时间类型那样高效处理,尤其在分区设计、范围过滤、表达式转换这些地方,代价会更大。
更合理的方式一般是直接用 DATE 或 DATETIME:
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 当场写错了,而是表结构从一开始就给后续查询埋了坑。
时间字段、金额字段、状态字段,这三类尤其容易出问题。时间用字符串、金额用浮点、状态用长文本,这几种设计后面都容易吃亏。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526