本页面介绍了如何在 AlloyDB for PostgreSQL 中保持列式引擎列存储区中数据的新鲜度。
在添加、删除或更新表行时,列式引擎不会立即更新列存储区中的数据。相反,它会将列存储区中受影响的内容标记为无效,并使用来自列存储区的面向列的数据及来自行缓存和数据库存储的面向行的数据,来规划和执行查询。
随着时间的推移,随着越来越多的数据块变为无效,列式引擎提供的查询性能改进会降低到需要刷新列式数据才能重新获得查询性能改进的程度。达到此刷新阈值后,列式引擎会使用后台作业刷新列存储区中的无效数据。默认情况下,列式引擎使用的刷新阈值为 50,这表示当列存储区中 50% 的内容变为无效时,系统会将该存储区中的给定内容标记为需要刷新。您可以更改此刷新阈值,以调整自动刷新的开销,并可能针对您的应用工作负载获得更好的持续查询性能。
此外,您还可以随时手动刷新加载到列式引擎中的表和 ScaNN 索引。通常,当您希望在对表进行更改后尽快在列存储区中反映相应更改时,可以执行手动刷新。
检查无效数据百分比
当您的应用在表中添加、删除或更新行时,列式引擎会将列存储区中受影响的数据标记为无效。您可以查询 g_columnar_relations
视图,查看表和物化视图的无效数据百分比。这有助于您决定是否需要执行手动刷新或调整自动刷新阈值。
如需查看列式存储区中所有关系失效的百分比,请执行以下查询:
SELECT relation_name, invalid_percentage FROM g_columnar_relations;
如需检查特定表的失效百分比,请在查询中添加 WHERE
子句。
SELECT relation_name, CASE WHEN total_block_count > 0 THEN (invalid_block_count * 100.0 / total_block_count) ELSE 0.0 END AS invalid_block_percentage FROM g_columnar_relations; WHERE relation_name = TABLE_NAME
将 TABLE_NAME
替换为包含表或具体化视图名称的字符串。如果资源处于 public
以外的架构中,请使用 SCHEMA_NAME.TABLE_NAME
格式指定架构名称,例如 myschema.mytable
。
如需检查特定索引的失效百分比,请向查询中添加 WHERE
子句。
SELECT index_name, CASE WHEN total_block_count > 0 THEN (invalid_block_count * 100.0 / total_block_count) ELSE 0.0 END AS invalid_block_percentage FROM g_columnar_indexes; WHERE index_name = INDEX_NAME
更改列式引擎的刷新阈值
如需更改列式引擎的刷新阈值,您必须修改 AlloyDB 实例的 google_columnar_engine.refresh_threshold_percentage
数据库标志的值。
控制台
- 在 Google Cloud 控制台中,前往集群页面。
- 点击包含要配置的实例的集群的名称。
- 在集群中的实例部分中,找到相应实例,然后点击修改。
- 在标志部分中,添加新标志或修改现有的
google_columnar_engine.refresh_threshold_percentage
标志。 - 将该值设置为介于
1
和100
之间的整数。此值表示触发刷新的无效数据百分比。 - 点击完成。
gcloud
如需使用 gcloud CLI,您可以安装并初始化 Google Cloud CLI,也可以使用 Cloud Shell。
如需更改列式引擎的刷新阈值,请运行以下命令:gcloud alloydb instances update INSTANCE_ID \ --database-flags=google_columnar_engine.refresh_threshold_percentage=THRESHOLD \ --cluster=CLUSTER_ID \ --region=REGION_ID \ --project=PROJECT_ID
替换以下内容:
- INSTANCE_ID:实例的 ID。
- THRESHOLD:介于
1
到100
之间的整数值。此值指定内容中必须有相应百分比的数据块变为无效,才会将内容标记为需要刷新。 - CLUSTER_ID:实例所在集群的 ID。
- REGION_ID:集群的区域。
- PROJECT_ID:项目的 ID。
在列存储区中手动刷新表和 ScaNN 索引
您可以使用专用 SQL 函数随时手动刷新列式引擎中的表和 ScaNN 索引。
如需在列式引擎中刷新表的数据,请执行 google_columnar_engine_refresh
函数。
SELECT google_columnar_engine_refresh(TABLE_NAME);
将 TABLE_NAME
替换为包含表或具体化视图名称的字符串。如果资源处于 public
以外的架构中,请使用 SCHEMA_NAME.TABLE_NAME
格式指定架构名称,例如 myschema.mytable
。
同样,如需在列式引擎中手动刷新 ScaNN 索引,请执行 google_columnar_engine_refresh_index
函数。
SELECT google_columnar_engine_refresh_index(index => INDEX_NAME);
将 INDEX_NAME
替换为包含要刷新的 ScaNN 索引名称的字符串。