因为有主键自动增长的话,是按主键替增的。
你可以查询出来以后在用 .. order by 进行排序!
如: select * from users order by id
排序内存涉及到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条)