我们配置了行列自动分流。通过本地客户端连接数据库,explain出来是行存索引,执行结果也是符合行存索引的。PolarDB程序每次执行都负载到列存节点上面了,怎么回事?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的情况,PolarDB程序在配置了行列自动分流后,EXPLAIN
结果显示为行存索引,但实际执行时却负载到了列存节点上。这种现象可能与以下几个因素有关:
行列自动分流的核心机制是基于SQL语句的预估执行代价来判断是否将请求路由到列存节点或行存节点。如果SQL语句的预估执行代价超过了设定的阈值,则会被路由到列存节点。
检查当前阈值参数:
loose_cost_threshold_for_imci
。如何确认SQL语句的预估执行代价: 您可以通过以下命令查询上一条SQL语句的预估执行代价:
/*ROUTE_TO_LAST_USED*/SHOW STATUS LIKE 'Last_query_cost';
如果查询结果显示的Value
值大于当前的阈值(如50000),则说明该SQL语句被路由到列存节点是符合预期的。
调整阈值: 如果希望更多SQL语句使用行存节点,可以降低loose_cost_threshold_for_imci
的值。例如,将其设置为1:
SET GLOBAL loose_cost_threshold_for_imci = 1;
如果您的SQL语句中包含了HINT
语法,可能会强制指定执行计划,导致实际执行结果与EXPLAIN
结果不一致。
检查是否存在强制列存执行计划的HINT: 如果SQL语句中包含类似以下的HINT语法,则会强制使用列存执行计划:
SELECT /*+ USE_IMCI_ENGINE */ ...
这种情况下,即使EXPLAIN
显示为行存索引,实际执行时仍会路由到列存节点。
解决方法: 如果不需要强制使用列存执行计划,可以移除相关HINT语法,或者显式指定行存执行计划:
SELECT /*+ SET_VAR(USE_IMCI_ENGINE=OFF) */ ...
行列自动分流依赖于集群地址的配置。如果集群地址的服务节点中未正确配置行存和列存节点,可能导致分流异常。
检查服务节点配置: 确保目标集群地址的服务节点中同时包含行存和列存只读节点,并且已开启行存/列存自动引流功能。
验证配置步骤:
如果在负载均衡设置中将主库是否接受读设置为是,部分OLTP类读请求可能会被路由到主节点,而OLAP类读请求仍然会被路由到列存节点。
列存索引的存在: 如果表中已创建列存索引(IMCI),某些查询可能会优先选择列存索引,即使预估执行代价较低。您可以通过以下命令检查表是否启用了列存索引:
SHOW CREATE TABLE table_name;
系统资源负载: 如果行存节点的资源负载较高,数据库代理可能会优先将请求路由到列存节点以平衡负载。
loose_cost_threshold_for_imci
参数。如果以上方法仍无法解决问题,建议联系阿里云技术支持,提供具体的SQL语句、集群配置和日志信息,以便进一步分析和解决。
阿里云关系型数据库主要有以下几种:RDS MySQL版、RDS PostgreSQL 版、RDS SQL Server 版、PolarDB MySQL版、PolarDB PostgreSQL 版、PolarDB分布式版 。