在PolarDB想查询drds的表大小没数据,加一个子查询就出结果了,怎么回事?select sum(s.DATA_LENGTH) from INFORMATION_SCHEMA.TABLES s;
SELECT * FROM( SELECT sum( s.DATA_LENGTH ) FROM INFORMATION_SCHEMA.TABLES s ) a;
在PolarDB中查询表大小时,直接使用SELECT sum(s.DATA_LENGTH) FROM INFORMATION_SCHEMA.TABLES s;可能不会返回预期结果,而当你通过子查询SELECT * FROM( SELECT sum( s.DATA_LENGTH ) FROM INFORMATION_SCHEMA.TABLES s ) a;时却能获得数据,这种情况通常与查询优化和数据统计信息的收集有关。可参考官方文档
当你说在PolarDB中查询DRDS(Distributed Relational Database Service)的表大小没有得到预期数据,但加入子查询后得到了结果,这可能是由于多种原因导致的。首先,我们需要明确查询的具体内容和形式。
数据同步问题:DRDS是分布式数据库服务,可能存在数据同步延迟。直接查询可能没有读取到最新的数据表大小信息,而子查询可能因为某种原因(如重新连接到数据库)而读取到了更新后的数据。
权限问题:直接查询可能由于权限不足而未能访问information_schema或相应的表。加入子查询后,可能以某种方式改变了查询的上下文或执行路径,从而避开了权限问题。
查询逻辑:加入子查询可能改变了查询的逻辑,使得查询能够正确执行。例如,子查询可能返回了一个确定的值,这个值被用作外部查询的条件,从而筛选出了正确的结果。
查询优化器:数据库查询优化器可能会根据查询的复杂性重新组织查询的执行计划。加入子查询后,查询优化器可能选择了不同的执行路径,从而得到了不同的结果。
缓存:数据库可能使用了查询缓存。直接查询可能由于缓存中的旧数据而没有返回最新结果,而子查询可能绕过了缓存或强制刷新了缓存。
数据可见性:在分布式数据库中,可能存在数据可见性的问题。直接查询可能由于事务隔离级别或数据版本控制而没有看到最新的数据,而子查询可能以不同的方式执行,从而看到了更新的数据。
您遇到的情况可能与查询的执行环境或数据访问权限有关。在PolarDB与DRDS环境下,直接执行 SELECT sum(s.DATA_LENGTH) FROM INFORMATION_SCHEMA.TABLES s; 未能获取数据,可能是因为查询优化器处理方式或特定配置影响了查询结果的返回。而当您包裹在一个子查询中,如 SELECT * FROM (SELECT sum( s.DATA_LENGTH ) FROM INFORMATION_SCHEMA.TABLES s) a;,这样的操作在某些情况下可以改变查询的上下文,或者避免了某些特定的优化逻辑,从而能够成功返回数据。
PolarDB-X 对于复杂查询和子查询的支持具有详细的规定,具体支持的子查询类型如比较子查询、存在性子查询等,请参考官方文档关于支持的子查询的部分
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
PolarDB 分布式版 (PolarDB for Xscale,简称“PolarDB-X”) 是阿里云自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。