如何提高oracle排序速度

lyl744455 2011-01-24 04:28:24
数据比较多
当用select * from patriot_comments查询只要0.063秒,
但用select * from patriot_comments order by floor desc要53.063秒,
只用了一个排序就多用了很多时间,
诚请高手赐教
...全文
1610 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
心中的彩虹 2011-01-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wkc168 的回复:]
引用楼主 lyl744455 的回复:
数据比较多
当用select * from patriot_comments查询只要0.063秒,
但用select * from patriot_comments order by floor desc要53.063秒,
只用了一个排序就多用了很多时间,
诚请高手赐教

1
如果排序字段是not null 则可以建立索引

2
加大
……
[/Quote]

alter session set sort_area_size=100000000
试试

修改这个的谨慎
心中的彩虹 2011-01-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 lyl744455 的回复:]
数据比较多
当用select * from patriot_comments查询只要0.063秒,
但用select * from patriot_comments order by floor desc要53.063秒,
只用了一个排序就多用了很多时间,
诚请高手赐教
[/Quote]
1
如果排序字段是not null 则可以建立索引

2
加大
sort_area_size 的大少

估计是你的count(*)的记录 的大少超过了sort_area_size 然后就使用了临时表空间 所以性能就下降了

show parameter sort_area_size ---查看多少 至少要超过count(*)*count(*)
Phoenix_99 2011-01-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 phoenix_99 的回复:]
增大sga的大小,让排序在内容中完成,可以节省时间,
这只是一种情况,具体情况具体分析
[/Quote]
确实说错了,应该是PGA
Leshami 2011-01-24
  • 打赏
  • 举报
回复
尝试修改PGA试试:


PGA的大小直接影响了性能,尤其针对会导致排序的SQL查询。以下几种情况需要提供足够的PGA:

导致排序的操作如 ORDER BY、GROUP BY、 ROLLUP等操作
哈希连接
位图合并
位图创建
批量数据装载

在Oracle 10g/11g版本中,PGA的管理被自动化设置,成为自动的PGA内存管理。在该方式中,Oracle将动态调整PGA内存的大小为
SGA内存的20%,最小值是10MB。初始化参数PGA_AGGREGATE_TARGET显示了当前PGA的分配情况。
Oracle 提供了两个PGA建议
性能视图:V$PGA_TARGET_ADVICE和V$PGA_TARGET_ADVICE_HISTOGRAM。

sys@ORCL> show parameter pga

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 58M
sys@ORCL> SELECT round(pga_target_for_estimate / 1024 / 1024) est_target_mb,
2 estd_pga_cache_hit_percentage,
3 estd_overalloc_count,
4 pga_target_factor
5 FROM v$pga_target_advice
6 ORDER BY 1;

EST_TARGET_MB ESTD_PGA_CACHE_HIT_PERCENTAGE ESTD_OVERALLOC_COUNT PGA_TARGET_FACTOR
------------- ----------------------------- -------------------- -----------------
15 96 7 .25
29 96 7 .5
44 96 7 .75
58 100 5 1
70 100 0 1.2
81 100 0 1.4
93 100 0 1.6
104 100 0 1.8
116 100 0 2
174 100 0 3
232 100 0 4
348 100 0 6
464 100 0 8你可以参考下这里:
重学PGA
碧水幽幽泉 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 oraclefans_ 的回复:]
排序肯定要耗费时间,oracle排序的操作依赖于内存排序(pga_sort_size)和物理磁盘的排序(临时表空间),当然是在内存中排序的时间远远短于物理磁盘的排序。你在不使用order by 的时候oracle避免的排序的操作,肯定比不使用排序的时间短,如果你想缩短这个时间可以采取增加pga_sort_size的大小。这样使得你的操作在内存中进行,这样的速度肯定比较快,但是这个值不得太大,不然造……
[/Quote]
有点道理!
Oraclefans_ 2011-01-24
  • 打赏
  • 举报
回复
排序肯定要耗费时间,oracle排序的操作依赖于内存排序(pga_sort_size)和物理磁盘的排序(临时表空间),当然是在内存中排序的时间远远短于物理磁盘的排序。你在不使用order by 的时候oracle避免的排序的操作,肯定比不使用排序的时间短,如果你想缩短这个时间可以采取增加pga_sort_size的大小。这样使得你的操作在内存中进行,这样的速度肯定比较快,但是这个值不得太大,不然造成了太多的内存的浪费。。。
UPC子夜 2011-01-24
  • 打赏
  • 举报
回复
分析一下表试试analyze table
如果表里的数据更新比较频繁,重建一下索引
我也被这个问题困扰了很久了
接近百万的数据 不排序耗时零点几秒,排序的话 几十秒 差距太大了
njlywy 2011-01-24
  • 打赏
  • 举报
回复
排序费时间没什么问题…
bestdowt1314 2011-01-24
  • 打赏
  • 举报
回复
floor 字段建索引试试。
coolkisses 2011-01-24
  • 打赏
  • 举报
回复
乱入一下,怀疑和表的长期使用,累积了不少碎片有关?
100W,大不了重建表,同样的查询试一下?
lyl744455 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhuomingwang 的回复:]
引用楼主 lyl744455 的回复:
数据比较多
当用select * from patriot_comments查询只要0.063秒,
但用select * from patriot_comments order by floor desc要53.063秒,
只用了一个排序就多用了很多时间,
诚请高手赐教

数据有多少啊?看来楼主只能从电脑配置入手了
[/Quote]

既然不排序,查询时间很短,配置肯定说得过去啊,数据100多万条吧,急等
coolkisses 2011-01-24
  • 打赏
  • 举报
回复
没有限制条件,这条语句是把全部数据例循一遍,有索引好像也没什么用吧。
minitoy 2011-01-24
  • 打赏
  • 举报
回复
上面说错了,排序用的是临时表空间
Phoenix_99 2011-01-24
  • 打赏
  • 举报
回复
增大sga的大小,让排序在内容中完成,可以节省时间,
这只是一种情况,具体情况具体分析
lyl744455 2011-01-24
  • 打赏
  • 举报
回复
索引基本上不会提高速度
  • 打赏
  • 举报
回复
[Quote=引用楼主 lyl744455 的回复:]
数据比较多
当用select * from patriot_comments查询只要0.063秒,
但用select * from patriot_comments order by floor desc要53.063秒,
只用了一个排序就多用了很多时间,
诚请高手赐教
[/Quote]
数据有多少啊?看来楼主只能从电脑配置入手了
minitoy 2011-01-24
  • 打赏
  • 举报
回复
如果排序字段有索引,可能会快点
minitoy 2011-01-24
  • 打赏
  • 举报
回复
较大的undo,较好的cpu,单纯从sql角度没什么提高的办法
gelyon 2011-01-24
  • 打赏
  • 举报
回复
排序耗费时间是没什么问题的

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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