我在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 来监视进度