oracle 分页查询中计算总页数的count(*) 效率问题

铁铲 2015-08-13 09:36:15
今天接到一个紧急需求遇到的问题。
oracle count 几千万级 查询记录总数、总条数优化问题。
做分页时查询的时候 速度约 2s 速度可以接受,sql形式如下面的
SELECT *
FROM (SELECT ROWNUM AS rowno, t.*
FROM emp t
WHERE ROWNUM <= 200) table_alias
WHERE table_alias.rowno >= 1;

但是计算总数的时候 select count(*) from emp ;时非常慢。快30秒了
这个问题应该很多人都会遇到的。求大神告知






...全文
3017 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
铁铲 2016-01-14
  • 打赏
  • 举报
回复
异步分页 没有太好的办法
lhdz_bj 2015-11-30
  • 打赏
  • 举报
回复
引用 19 楼 u012903926 的回复:
进行表分析后
嗯,分析前之所以慢,可能有三个原因: 1、可能没走对索引,看你的贴的图,收集前走了索引的,但不知道走的对不对; 2、可能没走索引,直接走了FTS; 3、走对了索引,但索引长期没重建,变得很大了;
铁铲 2015-11-26
  • 打赏
  • 举报
回复
收集统计信息 我没有这个权限 现在我的解决办法是 :异步分页实在想不出办法了。我查过资料好像根本没有办法解决的
越烟 2015-11-25
  • 打赏
  • 举报
回复
@u012903926 , 你这个查询是典型的统计信息过时, 而且表还有主键, 没有统计信息时候, oracle以为这个表是 小表, 才几百条数据 所以 sort 了, 收集统计信息, 就是告诉 oracle 这个表是大表。 查询时候注意。 你看下 收集统计信息后 计划中 还sort 吗????
铁铲 2015-10-30
  • 打赏
  • 举报
回复
进行表分析后
铁铲 2015-10-30
  • 打赏
  • 举报
回复
DBA 说每次空闲的时候会自动 去进行表分析 。。。 我这每次好像都要手动进行表分析
铁铲 2015-10-30
  • 打赏
  • 举报
回复
引用 16 楼 tangren 的回复:
具体要看执行计划,研究一下执行计划吧



一渣程序猿 2015-10-28
  • 打赏
  • 举报
回复
select count(1) from tableName
tangren 2015-10-28
  • 打赏
  • 举报
回复
具体要看执行计划,研究一下执行计划吧
铁铲 2015-10-28
  • 打赏
  • 举报
回复
这个问题 已经解决 公司的DBA 重建了几个索引 和 对表进行了分析 就解决了 DBA 说我公司的表从13年之后就没进行过表分析 我都不知道为什么进行了表分析后速度会快这么多求告知
铁铲 2015-10-28
  • 打赏
  • 举报
回复
引用
引用 11 楼 u012903926 的回复: Quote: 引用 8 楼 daiqiulong2 的回复: 楼主 你确定是查询总记录?? 我这边有个偏方... select num_rows from uer_tables where table_name='T'; 这个先要收集一下统计信息。 这个偏方不错啊。 这个查询出来是什么效果?
可以得到 table 的总数
daniel2021 2015-10-25
  • 打赏
  • 举报
回复
引用 11 楼 u012903926 的回复:
[quote=引用 8 楼 daiqiulong2 的回复:] 楼主 你确定是查询总记录?? 我这边有个偏方... select num_rows from uer_tables where table_name='T'; 这个先要收集一下统计信息。
这个偏方不错啊。 [/quote] 这个查询出来是什么效果?
qq_32250319 2015-10-23
  • 打赏
  • 举报
回复
1、重新数据统计下 2、如果有索引最好的是创建索引 3、加一些hint执行试试看 4、看是否可以进行分区改造
铁铲 2015-10-20
  • 打赏
  • 举报
回复
引用 8 楼 daiqiulong2 的回复:
楼主 你确定是查询总记录?? 我这边有个偏方... select num_rows from uer_tables where table_name='T'; 这个先要收集一下统计信息。
这个偏方不错啊。
铁铲 2015-10-19
  • 打赏
  • 举报
回复
引用 8 楼 daiqiulong2 的回复:
楼主 你确定是查询总记录?? 我这边有个偏方... select num_rows from uer_tables where table_name='T'; 这个先要收集一下统计信息。
先要收集一下统计信息有什么用?
beyon2008 2015-10-19
  • 打赏
  • 举报
回复
analyze table emp compute statistics;
越烟 2015-09-09
  • 打赏
  • 举报
回复
楼主 你确定是查询总记录?? 我这边有个偏方... select num_rows from uer_tables where table_name='T'; 这个先要收集一下统计信息。
铁铲 2015-08-13
  • 打赏
  • 举报
回复
重建索引
铁铲 2015-08-13
  • 打赏
  • 举报
回复
rebuild一下索引 是什么? 是在语句中加入 /*+ROWID(USER)*/或者/*+ INDEX(USER ID) */ 来提高查询效果吗?
铁铲 2015-08-13
  • 打赏
  • 举报
回复
表中有主键了。 分页的确是没有排序的 。能不排序所以就不排序了
加载更多回复(4)

3,488

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧