为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:linux
【CPU】:
【问题描述】*:
1、问题描述:
执行SELECT * FROM SYS.USER_SEGMENTS WHERE SEGMENT_TYPE = 'TABLE'特变慢 查询不出结果,但是不加条件可以查询,咨询下各位老师怎么修改下才能查出来;
2、已经做过的操作:
(1)不加条件可查出100条
(2)重启数据库;
3、数据库参数如下:
4、具体表现截图如下:
(1)带条件查询
(2)不带条件查询
一、每家数据库的底层设计有差异,在达梦中查对象信息推荐使用DM的数据字典表 SYSOBJECTS,比如 SELECT * FROM SYSOBJECTS WHERE ... AND ...
,字典详细见《DM8系统管理员手册》或者链接https://eco.dameng.com/document/dm/zh-cn/pm/dm8-admin-manual-appendix.html
二、USER_SEGMENTS 视图是兼容O做的一个视图,构造比较复杂,我创建了1千个分区表可以复现您的问题(几分钟查不出)。首选推荐的解决办法如一中使用SYSOBJECTS,其次可以收集达梦数据字典统计信息来缓解(存在表对象很多或者分区子表很多的情况):
DBMS_STATS.GATHER_TABLE_STATS( 'SYS', 'SYSOBJECTS', NULL, 100, TRUE, 'FOR ALL COLUMNS SIZE AUTO' );
DBMS_STATS.GATHER_TABLE_STATS( 'SYS', 'SYSINDEXES', NULL, 100, TRUE, 'FOR ALL COLUMNS SIZE AUTO' );
再次查询,注意避免之前旧执行计划影响,可以清理旧计划缓存(在https://eco.dameng.com/搜索 数据库性能优化)或者简单在SQL里加点无用的注释,或者SELECT后加几个空格,是可以查出来的:
感觉你的表非常多,表的分区也很多。
管理工具本身快速返回100条。在无条件情况下,扫满100条立即返回。
可以改查dba_segments会比较快,这个问题我们已经注意到了,预计会在下个版本改善
您是要查询什么呢?USER_SEGMENTS是当前用户对象拥有的段分配的存储信息的系统视图,查询,和服务器的IO、以及对象数量有关系,这个视图查询代价很大,带条件比较慢,你这是对象比较多吧
可以查看下代价