本页面简要介绍了 AlloyDB for PostgreSQL 提供的列式引擎,并展示了如何使用该引擎。
AlloyDB 列式引擎通过提供以下组件来加快扫描、联接和汇总的 SQL 查询处理速度:
列存储区,其中包含所选列的表和物化视图数据(重新整理为面向列的格式)。
列式查询规划工具和执行引擎,支持在查询中使用列存储区。
列式引擎可用于主实例和/或读取池实例。您还可以使用自动列式处理来分析工作负载,并使用可带来最佳性能提升的列自动填充列存储区。
如需将列式引擎用于特定查询,该查询片段中的所有列(例如联接和扫描)都必须位于列存储区中。
默认情况下,列式引擎设置为使用 30% 的实例内存。根据您的工作负载、内存用量以及是否配置了读取池,您可以选择减少主实例上的列式引擎内存分配,并为读取池实例分配更多内存。 如需查看和监控列式引擎的内存用量,请参阅查看列存储区内存用量。如需修改列存储区使用的内存大小,请参阅配置列存储区的大小。如需查找适合您的实例的推荐列式引擎内存大小,请参阅推荐列存储区内存大小。
可从列式引擎中受益的查询类型
某些查询可以从列式引擎中受益。以下列出了从列式引擎中受益最多的操作及其查询句式:
表扫描
- 它具有选择性过滤条件,例如
WHERE
子句。 - 它使用较大表或具体化视图中的少量列。
- 它使用
LIKE
、SUBSTR
或 `TRIM 等表达式。
- 它具有选择性过滤条件,例如
聚合函数
- 它们仅使用以下表达式:
SUM
、MIN
、MAX
、AVG
和COUNT
。 - 位于列式扫描查询的开头。
- 它们未分组,或者按列分组。
- 它们仅使用以下表达式:
ORDER-BY
和SORT
:仅当ORDER-BY
或SORT
位于从列式引擎访问的列的扫描结果中时。LIMIT
:仅当运算符位于列式扫描查询的开头且位于任何SORT
或GROUP BY
运算符之前时。INNER HASH JOIN
仅当使用的键是列且未使用联接限定符时。选择性联接:仅当联接位于列式扫描查询的开头时。
如需详细了解哪些查询最适合使用列式引擎、查询是否使用了列式引擎以及如何使用列式引擎,请参阅使用 EXPLAIN
验证列式引擎的使用情况。
如何使用列式引擎
如需在 AlloyDB 实例中使用列式引擎,请执行以下大致步骤:
在实例上启用引擎。
启用引擎是一次性操作,需要重启。
向列存储区添加列。
如需向列存储区添加列,请使用以下方法之一:
您可以使用
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
vector
(预览版)
列式引擎会忽略任何将具有不受支持数据类型的列手动添加到列存储区的尝试。
不受支持的数据源
列式引擎不支持将以下属性作为数据源的表或物化视图:
非叶分区表
外部表
行数少于 5,000 的表或视图
列式引擎限制
- 如果您对具有索引的列运行分析查询,AlloyDB 优化器可能会选择使用行存储区。
- 手动添加到列存储区中的列不会被自动移除。如需强制移除手动添加的列,请对实例使用
google_columnar_engine_drop()
。 - 自动列式处理可能会根据查询使用情况动态添加和移除列。
- 列式引擎并不支持所有数据类型。如需查看支持的数据类型,请参阅支持的数据类型。
对行进行频繁更新会使列式数据失效。如需验证列式存储区中的表或具体化视图,您可以降低更新频率,也可以安排列式引擎更频繁地刷新。
您可以将 g_columnar_relations 中的
invalid_block_count
和total_block_count
列进行比较,以检查您的表或视图是否受到影响。如果您对表或视图进行了频繁或大量更改,invalid_block_count
会很高。