暂无图片
Oracle函数MAX性能优化
我来答
分享
TML
2022-07-01
Oracle函数MAX性能优化

数据库版本:ORACLE RAC 11.2.0.4

表数据量:8000万

索引:gxsj(更新时间)这个字段有一个索引,其他字段无索引。

SQL语句:

select count(gxsj) from emp;

执行特别慢,十几分钟,请问有什么方法优化吗


select count(gxsj) from emp where gxsj is null;  --返回0

我来答
添加附件
收藏
分享
问题补充
7条回答
默认
最新
Uncopyrightable

有19c以上版本,可以试试 APPROX_COUNT_DISTINCT函数,号称提升了好几倍性能

select APPROX_COUNT_DISTINCT(rowid) from emp;

暂无图片 评论
暂无图片 有用 0
刘晓华

这个SQL没where条件,肯定是全扫描,加索引也没用,只能增大吞吐量,如并行

暂无图片 评论
暂无图片 有用 0

如果你的表近期有使用过analyze 分析命令,可以直接使用它查看行数,select table_name,num_rows,last_analyzed from user_tables where table_name='TABLE_NAME';  否则统计字典里的数据量是last_analyzed数据量记录的

暂无图片 评论
暂无图片 有用 0
赵勇

提供一下执行计划。

暂无图片 评论
暂无图片 有用 0
薛晓刚

count全表,表越大越慢。而且你还是经常update的表。

除非你用in-memory  加载到内存列式存储。那么一秒可以完成聚合

暂无图片 评论
暂无图片 有用 0
chengang

可以看一下执行计划。不知道 gxsj 列的定义是否允许为null

如果不为null 那么执行计划
该是 index scan 而不是 table scan

暂无图片 评论
暂无图片 有用 0
老虎刘

如果是正常的业务SQL, 建议从业务合理性方面进行优化 ;   如果只是偶尔查询一次, 可以使用并行.   这个sql , 正常来说不需要看执行计划, 应该是index fast full scan, 不管列定义是null还是not null

暂无图片 评论
暂无图片 有用 0
赵勇
2022-08-26
刘老师,您说的是正常情况。我的想法是怀疑“gxsj(更新时间)这个字段有一个索引”,其实是一个gxsj列上的函数索引,比如to_char之类的。所以,看一下执行计划,验证一下。同时,从执行计划上,还可能发现一些其它有价值的信息。
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏