在添加、删除或更新表行时,列式引擎不会立即更新列存储区中的数据。相反,它会将列存储区中受影响的内容标记为无效,并使用来自列存储区的面向列的数据及来自行缓存和数据库存储的面向行的数据,来规划和执行查询。
随着时间的推移,随着越来越多的数据块变为无效,列式引擎提供的查询性能改进会降低到需要刷新列式数据才能重新获得查询性能改进的程度。达到此刷新阈值后,列式引擎会使用后台作业刷新列存储区中的无效数据。默认情况下,列式引擎使用的刷新阈值为 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
更改列式引擎的刷新阈值
如需更改列式引擎的刷新阈值,请完成以下步骤:
打开
DBCluster数据库集群清单。在
primarySpec部分下,将google_columnar_engine.refresh_threshold_percentage参数添加到parameters块:DBCluster: metadata: name: DB_CLUSTER_NAME spec: # ... existing cluster configuration ... primarySpec: # ... existing primary configuration ... parameters: google_columnar_engine.refresh_threshold_percentage: "THRESHOLD"替换以下内容:
DB_CLUSTER_NAME:数据库集群的名称。THRESHOLD:介于1和100之间的整数 值。此值指定内容中必须有相应百分比的数据块变为无效,才会将内容标记为需要刷新。
RPM 编排器会自动重启数据库以应用参数更改。使用以下任一方法应用更新后的
DBCluster清单:alloydbctlalloydbctl apply -d "DEPLOYMENT_SPEC_PATH" -r "DBCLUSTER_SPECIFICATION"替换以下内容:
DEPLOYMENT_SPEC_PATH:部署规范目录的路径。DBCLUSTER_SPECIFICATION:您修改的DBCluster清单的路径。
Ansible
创建
update.ymlplaybook 文件:--- - hosts: localhost vars: update_action: "update_resource_spec" ansible_user: SSH_USER ansible_ssh_private_key_file: SSH_KEY_PATH roles: - role: google.alloydbomni_orchestrator.update替换以下内容:
SSH_USER:您用于通过 SSH 连接到集群中节点的用户名。SSH_KEY_PATH:用于连接到节点的 SSH 私钥文件的本地路径。
从控制节点运行 playbook,并将资源规范作为额外变量传递:
ansible-playbook -i "DEPLOYMENT_SPEC_PATH" update.yml \ -e resource_spec="DBCLUSTER_SPECIFICATION"替换以下内容:
DEPLOYMENT_SPEC_PATH:部署规范目录的路径。DBCLUSTER_SPECIFICATION:您修改的DBCluster清单的路径。
手动刷新列存储区中的表和向量索引
您可以使用专用 SQL 函数随时手动刷新列式引擎中的表和向量索引。支持的索引类型包括 ScaNN 和 HNSW。
如需刷新列式引擎中的表数据,请执行 google_columnar_engine_refresh 函数。
SELECT google_columnar_engine_refresh(TABLE_NAME);
将 TABLE_NAME 替换为包含表或具体化视图名称的字符串。如果资源位于 public 以外的架构中,请使用 SCHEMA_NAME.TABLE_NAME 格式指定架构的名称,例如 myschema.mytable。
同样,如需手动刷新列式引擎中的向量索引,请执行 google_columnar_engine_refresh_index 函数。
SELECT google_columnar_engine_refresh_index(index => INDEX_NAME);
将 INDEX_NAME 替换为包含要刷新的索引名称的字符串。