跳至正文
Wener Notes

Citus Columnar

约 2 分钟阅读
  • unlogged
  • 在 I/O-bound 非常有用, CPU-bound 场景肯定比不过专门为 column 设计的执行引擎
sql
CREATE TABLE contestant (
    handle TEXT,
    birthdate DATE,
    rating INT,
    percentile FLOAT,
    country CHAR(3),
    achievements TEXT[]
) USING columnar;


-- 转换为 行 存储
SELECT alter_table_set_access_method('contestant', 'heap');
-- 转换为 列 存储 - index 会被 drop
SELECT alter_table_set_access_method('contestant', 'columnar');

VACUUM VERBOSE contestant;
  • 适用于单行数据量大时,减少加载到内存的数据
  • 适用于大数据分析 - 定时生成表
  • 有非常多的使用限制
    • Append-only - 不可更新和删除
    • Rollback 也不会恢复已写入空间
    • 只支持 hash 和 btree 索引
    • 不支持 index scan, bitmap index scan
    • 不支持 tiscan
    • 不支持 sample scan
    • 不支持 toast - inline 存储
    • 不支持 onconflict - 支持纯 DO NOTHING
    • 不支持 锁 - SELECT … FOR SHARE, SELECT … FOR UPDATE
    • 不支持 serializable isolation level
    • 不支持 foreign keys, unique constraints, exclusion constraints
    • 不支持 logical decoding
    • 不支持 intra-node parallel scans
    • 不支持 AFTER … FOR EACH ROW trigger
    • 无 UNLOGGED, TEMPORARY
  • strip
    • 150000 rows/strip - alter_columnar_table_set 可修改
    • 压缩单位
    • 每个事务会创建 - 如果一个事务只插入一条也会创建一个 strip
      • 尽量批量插入
      • 如果有很多小 strip,表是无法修复的,只能从新 INSERT INTO SELECT
修复表
BEGIN;
CREATE TABLE foo_compacted (LIKE foo) USING columnar;
INSERT INTO foo_compacted SELECT * FROM foo;
DROP TABLE foo;
ALTER TABLE foo_compacted RENAME TO foo;
COMMIT;

Chunk Group Filtering

关联信息

反向链接、本文链接的其他页面和外部资料。

参考资料

GitHub2 条
Hacker News1 条
其他外链1 条
最近更新commit d39b49b编辑