行存储是指将表按行存储到硬盘分区上,列存储是指将表按列存储到硬盘分区上。默认情况下,创建的表为行存储。要创建列存表需要在建表时指定WITH (ORIENTATION = COLUMN);
行、列存储模型各有优劣,通常用于TP场景的数据库,默认使用行存储,仅对执行复杂查询且数据量大的AP场景时,才使用列存储。
列存有利于压缩。
-- 1.
-- 注意如果只创一个单字段的表则无明显的比较的意义
-- 所以要创多个字段的表
create table row_tb (id int, num number);
\d+ row_tb;
create table column_tb (id int, num number)
with (orientation = column);
\d+ column_tb;
insert into row_tb select generate_series(1, 100000), (random() *(10^4))::int;
insert into column_tb select * from row_tb;
-- 2.
\d+
-- 对比非常明显 差距近7倍
-- row_db 占用了 4360 kB
-- column_db 占用了 632 kB 采用了 low 级别的压缩
-- 3.
analyze verbose row_tb;
analyze verbose column_tb;
explain analyze select id from row_tb;
-- Total runtime: 31.826 ms
explain analyze select id from column_tb;
-- Total runtime: 15.362 ms
-- 列存显然更快
explain analyze select * from row_tb;
-- Total runtime: 26.729 ms
explain analyze select * from column_tb;
-- Total runtime: 17.666 ms
-- 这种情况下也是列存更快,但并不具有普遍意义
explain analyze insert into row_tb values(0, '0');
-- Total runtime: 0.164 ms
explain analyze insert into column_tb values(0, '0');
-- Total runtime: 4.277 ms
-- 行存显然更快
-- 4.
drop table row_tb;
drop table column_tb;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。