本页介绍了 AlloyDB Omni 列式引擎,并提供了有关如何在容器和 Kubernetes 集群安装中使用该引擎的说明。本页假定您熟悉 PostgreSQL。
AlloyDB Omni 列式引擎通过提供以下组件来加快扫描、联接和汇总的 SQL 查询处理速度:
列存储区包含已重组为列式格式的所选列的表和 materialized-view 数据。
列式查询规划器和执行引擎,支持在查询中使用列存储。
您可以在主实例或读取池实例上使用列式引擎,也可以同时在主实例和读取池实例上使用。您还可以使用自动列化来分析工作负载,并使用可带来最佳性能提升的列自动填充列存储。
若要将列式引擎与特定查询搭配使用,查询中引用的所有列(例如联接、扫描)都必须位于列存储区中。
默认情况下,列式引擎会设置为使用实例的 1 GB 内存。根据您的工作负载、内存用量以及您是否配置了读取池,您可以选择减少主实例上的列式引擎内存分配,并向读取池实例分配更多内存。
如需查看和监控列式引擎的内存用量,请参阅查看列存储内存用量。如需修改列存储所使用的内存大小,请参阅配置列存储的大小。如需查找适用于您的实例的建议列式引擎内存大小,请参阅推荐列存储内存大小。
受益于列式引擎的查询类型
某些查询可以受益于列式引擎。以下列出了最能从列式引擎中受益的操作及其查询模式:
操作 | 查询格式 |
---|---|
表扫描 | 选择性过滤条件,例如 WHERE 子句。从较大的表或物化视图中选择少量列。 表达式,例如 LIKE 、SUBSTR 或 TRIM 。 |
聚合函数 | 仅限 SUM 、MIN 、MAX 、AVG 和 COUNT 等表达式。在列式扫描查询的开头。 未分组或按列分组。 |
ORDER-BY |
仅当该运算符位于列式扫描查询的开头时才有效。 |
SORT |
仅当该运算符位于列式扫描查询的开头,并且仅按表或具体化视图的基准列进行排序时,才会执行此操作。 |
LIMIT |
仅当该运算符位于列式扫描查询的开头且位于任何 SORT 或 GROUP BY 运算符之前时,才会被视为有效。 |
INNER HASH JOIN |
仅当所用键是列且未使用联接限定符时。 |
选择性联接 | 仅当联接位于列式扫描查询的开头时才会这样。 |
如需详细了解哪些查询最适合使用列式引擎、查询是否使用了列式引擎以及使用方式,请参阅使用 EXPLAIN
验证列式引擎的使用情况。
使用列式引擎
如需在 AlloyDB Omni 实例中使用列式引擎,您需要执行以下概要步骤:
在实例上启用引擎。
启用该引擎是一次性操作,需要重启数据库。
向列存储区添加列。
如需向列存储区添加列,请使用以下方法之一:
您可以使用
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_count
和total_block_count
列,检查您的表格或视图是否受到影响。如果您对表或视图进行频繁或大量更改,invalid_block_count
将会很高。