使用列式存储

提升 PostgreSQL 查询性能

Amy McCarty

Instructor

列式

列式存储

  • 保留行间关系
id name species age habitat received
01 Bob panda 2 Asia 2018
02 Sunny zebra 3 Africa 2018
03 Beco zebra 10 Africa 2017
04 Coco koala 5 Australia 2016

存储为

两张表。第一张为 id 与 species 列表:01 - panda;02 - zebra;03 - zebra;04 - koala。第二张为 id 与 age 列表:01 - 2;02 - 3;03 - 10;04 - 5。

提升 PostgreSQL 查询性能

侧重分析——匹配良好

列式存储特性

  • 同一列集中存放
  • 返回所有行更快
  • 列计算更快

分析为主

  • 计数、均值、计算
  • 报表
  • 列聚合

存储为

三张表。第一张为 id 与 name 列表:01 - Bob;02 - Sunny;03 - Beco;04 - Coco。第二张为 id 与 species 列表:01 - panda;02 - zebra;03 - zebra;04 - koala。第三张为 id 与 age 列表:01 - 2;02 - 3;03 - 10;04 - 5。

提升 PostgreSQL 查询性能

侧重事务——不匹配

保留行关系

  • 返回所有列较慢
  • 加载数据较慢

事务为主

  • 插入、删除更快

存储为

三张表。第一张为 id 与 name 列表:01 - Bob;02 - Sunny;03 - Beco;04 - Coco。第二张为 id 与 species 列表:01 - panda;02 - zebra;03 - zebra;04 - koala。第三张为 id 与 age 列表:01 - 2;02 - 3;03 - 10;04 - 5。

提升 PostgreSQL 查询性能

数据库示例

 

Postgres Citus Data、Greenplum、Amazon Redshift
MySQL MariaDB
Oracle Oracle In-Memory Cloud Store
Clickhouse、Apache Druid、CrateDB
提升 PostgreSQL 查询性能

信息架构

减少列数

  • 谨慎使用 SELECT *
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_catalog = 'schema_name'
AND table_name = 'zoo_animals'
column_name data_type
id integer
name text
species text
提升 PostgreSQL 查询性能

信息架构

减少列数

  • 谨慎使用 SELECT *
  • 使用信息架构
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_catalog = 'schema_name'
AND table_name = 'zoo_animals'
column_name data_type
id integer
name text
species text
提升 PostgreSQL 查询性能

编写查询

 

  • 分别用独立查询检查每一列
id name species age habitat received
01 Bob panda 2 Asia 2018
02 Sunny zebra 3 Africa 2018
03 Beco zebra 10 Africa 2017
04 Coco koala 5 Australia 2016
-- Structure for column oriented
SELECT MIN(age), MAX(age)
FROM zoo_animals
WHERE species = 'zebra'
-- Structure for row-oriented
SELECT *
FROM zoo_animals
WHERE species = 'zebra'
ORDER BY age
提升 PostgreSQL 查询性能

Vamos praticar!

提升 PostgreSQL 查询性能

Preparing Video For Download...