oracle排序是在内存中,oracle 排序内存

我在http://zhidao.baidu.com/question/123262452.html?fr=msg 提的问题,整理到这里 非常感谢 zjwssg 的回答

排序内存涉及到PGA。 什么时候使用自动PGA内存管理?什么时候使用手动PGA内存管理?   白天系统正常运行时适合使用自动PGA内存管理,让Oracle根据当前负载自动管理、分配PGA内存。   夜里用户数少、进行维护的时候可以设定当前会话使用手动PGA内存管理,让当前的维护操作获得尽可能多的内存,加快执行速度。   如:服务器平时运行在自动PGA内存管理模式下,夜里有个任务要大表进行排序连接后更新,就可以在该操作session中临时更改为手动PGA内存管理,然后分配大的SORT_AREA_SIZE和HASH_AREA_SIZE(50%甚至80%内存,要确保无其他用户使用),这样能大大加快系统运行速度,又不影响白天高峰期对系统造成的影响。  操作命令     会话级更改   ALTER SESSION SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};   ALTER SESSION SET SORT_AREA_SIZE = 65536;   ALTER SESSION SET HASH_AREA_SIZE = 65536;  学以致用   1,排序区:   pga_aggregate_target为100MB,单个查询能用到5%也就是5MB时排序所需时间   SQL> create table sorttable as select * from all_objects;   表已创建。   SQL> insert into sorttable (select * from sorttable);   已创建49735行。   SQL> insert into sorttable (select * from sorttable);   已创建99470行。   SQL> set timing on; SQL> set autotrace traceonly;   SQL> select * from sorttable order by object_id;   已选择198940行。   已用时间:  00: 00: 50.49   Session级修改排序区为30mb所需时间   SQL> ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;   会话已更改。   已用时间:  00: 00: 00.02   SQL> ALTER SESSION SET SORT_AREA_SIZE = 30000000;   会话已更改。   已用时间:  00: 00: 00.01   SQL> select * from sorttable order by object_id;   已选择198940行。   已用时间:  00: 00: 10.76   可以看到所需时间从50.49秒减少到10.31秒,速度提升很明显。   2,散列区:   pga_aggregate_target为100MB,单个查询能用到5%也就是5MB时表连接所需时间   SQL> select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;   已选择49735行。   已用时间:  00: 00: 40.50   Session级修改散列区为30mb所需时间   SQL> ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;   会话已更改。   已用时间:  00: 00: 00.01   SQL> ALTER SESSION SET HASH_AREA_SIZE = 30000000;   会话已更改。   已用时间:  00: 00: 00.01   SQL> select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;   已选择49735行。   已用时间:  00: 00: 04.47   所需时间由40.50秒提升到4.47秒,效果同样很明显。   备注:以上实验皆执行全表扫描保证相关表读入缓冲区中,避免因数据没读入缓存造成误差。 ---另一个网址的: 总结一下: 1。 使用并行参数,8个CPU, 可以用parallel 6 ,最多占用6个CPU, 正常情况下没问题(前提是其他应用没有占超过2个CPU的资源) 2。 nologging, 绝对应该使用,会使速度大幅上升。(减少大量redo log) 3。 PGA, 普通的auto pga最大才100M, 显然没有达到最好性能,应该使用manual pga alter session set workarea_size_policy=manual; alter session set  hash_area_size=100000; -- hash_area_size 默认情况下会自动根据sort_area_size*2来调,导致sort_area_size不能超过1G, 手动设了就没问题了。 alter session set sort_area_size=2000000000; -- 在系统可用内存足够的情况下,最大可以到2G 4。 设置高一点的db_file_multiblock_read_count 也有利于提高I/O性能。保证足够大的db_cache_size可以避免free_buffer_wait的出现 5。 可以通过v$session_longops 来监视进度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值