AlloyDB Omni 列式引擎概览

本页面介绍了 AlloyDB Omni 列式引擎,并提供了有关如何在容器和 Kubernetes 集群安装中使用该引擎的说明。本页面假定您熟悉 PostgreSQL。

AlloyDB Omni 列式引擎通过提供以下组件来加快扫描、联接和汇总的 SQL 查询处理速度:

  • 列存储区,其中包含所选列的表和物化视图数据(重新整理为面向列的格式)。

  • 列式查询规划工具和执行引擎,支持在查询中使用列存储区。

您可以在主实例和/或读取池实例上使用列式引擎。您还可以使用自动列式处理来分析工作负载,并使用可带来最佳性能提升的列自动填充列存储区。

如需将列式引擎用于特定查询,该查询中引用的所有列(例如联接、扫描)都必须位于列存储区中。

默认情况下,列式引擎设置为使用 1 GB 的实例内存。根据您的工作负载、内存用量以及是否配置了读取池,您可以选择减少主实例上的列式引擎内存分配,并为读取池实例分配更多内存。

如需查看和监控列式引擎的内存用量,请参阅查看列存储区内存用量。如需修改列存储区使用的内存大小,请参阅配置列存储区的大小。如需查找适合您的实例的推荐列式引擎内存大小,请参阅推荐列存储区内存大小

可从列式引擎中受益的查询类型

某些查询可以从列式引擎中受益。以下列出了从列式引擎中受益最多的操作及其查询句式:

操作 查询句式
表扫描 选择性过滤条件,例如 WHERE 子句。
较大表或物化视图中的少量列。
LIKESUBSTRTRIM 等表达式。
聚合函数 仅限 SUMMINMAXAVGCOUNT 等表达式。
位于列式扫描查询的开头。
未分组或按列分组。
ORDER-BY 仅当运算符位于列式扫描查询的开头时。
SORT 仅当运算符位于列式扫描查询的开头并且仅对表或物化视图的基列进行排序时。
LIMIT 仅当运算符位于列式扫描查询的开头且位于任何 SORTGROUP BY 运算符之前时。
INNER HASH JOIN 仅当使用的键是列且未使用联接限定符时。
选择性联接 仅当联接位于列式扫描查询的开头时。

如需详细了解哪些查询最适合使用列式引擎、查询是否使用了列式引擎以及如何使用列式引擎,请参阅使用 EXPLAIN 验证列式引擎的使用情况

如何使用列式引擎

如需在 AlloyDB Omni 实例中使用列式引擎,请执行以下大致步骤:

  1. 在实例上启用引擎

    启用引擎是一次性操作,需要重启数据库。

  2. 向列存储区添加列。

    如需向列存储区添加列,请使用以下方法之一:

  3. 您可以使用 g_columnar_relations 视图跟踪列存储区中的内容,并且在添加列后,您可以使用 EXPLAIN 语句验证 SQL 查询中列式引擎的使用情况。

如需详细了解如何使用列式引擎,请参阅配置列式引擎

您可以向列存储区添加哪些数据

向列存储区添加列时,您可以使用的数据类型和数据源有一些限制。

支持的数据类型

列式引擎仅支持具有以下内置数据类型的列:

  • array
  • bigint
  • boolean
  • bytea
  • char
  • date
  • decimal
  • double precision
  • enum
  • float4
  • float8
  • integer
  • json
  • jsonb
  • numeric
  • real
  • serial
  • short
  • smallint
  • text
  • timestamp
  • uuid
  • varchar

列式引擎会忽略任何将具有不受支持数据类型的列手动添加到列存储区的尝试。

不受支持的数据源

列式引擎不支持将以下属性作为数据源的表或物化视图:

  • 非叶分区表

  • 外部表

  • 行数少于 5,000 的表或视图

列式引擎限制

  • 如果您对具有索引的列运行分析查询,AlloyDB Omni 优化器可能会选择使用行存储区。
  • 手动添加到列存储区中的列不会被自动移除。如需强制移除手动添加的列,请对实例使用 google_columnar_engine_drop
  • 自动列式处理可能会根据查询使用情况动态添加和移除列。
  • 列式引擎并不支持所有数据类型。如需查看支持的数据类型,请参阅支持的数据类型
  • 对行进行频繁更新会使列式数据失效。如需验证列式存储区中的表或物化视图,您可以降低更新频率,也可以安排列式引擎更频繁地刷新

    您可以将 g_columnar_relations 中的 invalid_block_counttotal_block_count 列进行比较,以检查您的表或视图是否受到影响。如果您对表或视图进行了频繁或大量更改,invalid_block_count 会很高。

后续步骤