AlloyDB 列式引擎简介

本页面简要介绍了 AlloyDB for PostgreSQL 提供的列式引擎,并介绍了如何使用该引擎。

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

  • 列存储区,其中包含已重组为列式格式的所选列的表和具体化视图数据。

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

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

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

默认情况下,列式引擎会设置为使用实例内存的 30%。根据您的工作负载、内存用量以及您是否配置了读取池,您可以选择减少主实例上的列式引擎内存分配,并向读取池实例分配更多内存。如需查看和监控列式引擎的内存用量,请参阅查看列存储内存用量。如需修改列存储所使用的内存大小,请参阅配置列存储的大小。如需查找适用于您的实例的建议列式引擎内存大小,请参阅推荐列存储内存大小

受益于列式引擎的查询类型

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

  • 表扫描

    • 它具有选择性过滤条件,例如 WHERE 子句。
    • 它使用较大表或具体化视图中的少量列。
    • 它使用 LIKESUBSTR 或 `TRIM 等表达式。
  • 汇总函数

    • 它们仅使用以下表达式:SUMMINMAXAVGCOUNT
    • 它们位于列式扫描查询的开头。
    • 它们未分组,或按列分组。
  • ORDER-BYSORT:仅当 ORDER-BYSORT 位于从列式引擎访问的列的扫描结果中时。

  • LIMIT:仅当该运算符位于列式扫描查询的开头且位于任何 SORTGROUP BY 运算符之前时才有效。

  • 仅当使用的键是列且未使用联接限定符时,才使用 INNER HASH JOIN

  • 选择性联接(仅当联接位于列式扫描查询的开头时)。

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

如何使用列式引擎

如需在 AlloyDB 实例中使用列式引擎,您需要执行以下概要步骤:

  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
  • timestamptz
  • uuid
  • varchar

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

不支持的数据源

列式引擎不支持将具有以下属性的表或具体化视图用作数据源:

  • 非叶分区表

  • 外部表

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

列式引擎限制

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

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

后续步骤