Oracle系统调优详解
oracle数据库性能调优

oracle数据库性能调优⼀:注意WHERE⼦句中的连接顺序:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾.尤其是“主键ID=?”这样的条件。
⼆: SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
简单地讲,语句执⾏的时间越短越好(尤其对于系统的终端⽤户来说)。
⽽对于查询语句,由于全表扫描读取的数据多,尤其是对于⼤型表不仅查询速度慢,⽽且对磁盘IO造成⼤的压⼒,通常都要避免,⽽避免的⽅式通常是使⽤索引Index。
三:使⽤索引的优势与代价。
优势:1)索引是表的⼀个概念部分,⽤来提⾼检索数据的效率,ORACLE使⽤了⼀个复杂的⾃平衡B-tree结构. 通常,通过索引查询数据⽐全表扫描要快. 当ORACLE找出执⾏查询和Update语句的最佳路径时, ORACLE优化器将使⽤索引. 同样在联结多个表时使⽤索引也可以提⾼效率. 2)另⼀个使⽤索引的好处是,它提供了主键(primary key)的唯⼀性验证.。
那些LONG或LONG RAW数据类型, 你可以索引⼏乎所有的列. 通常, 在⼤型表中使⽤索引特别有效. 当然,你也会发现, 在扫描⼩表时,使⽤索引同样能提⾼效率.代价:虽然使⽤索引能得到查询效率的提⾼,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本⾝也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反⽽会使查询反应时间变慢.。
⽽且表越⼤,影响越严重。
使⽤索引需要注意的地⽅:1、避免在索引列上使⽤NOT , 我们要避免在索引列上使⽤NOT, NOT会产⽣在和在索引列上使⽤函数相同的影响. 当ORACLE”遇到”NOT,他就会停⽌使⽤索引转⽽执⾏全表扫描.2、避免在索引列上使⽤计算.WHERE⼦句中,如果索引列是函数的⼀部分.优化器将不使⽤索引⽽使⽤全表扫描.举例:代码如下:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;⾼效:SELECT … FROM DEPT WHERE SAL > 25000/12;3、避免在索引列上使⽤IS NULL和IS NOT NULL避免在索引中使⽤任何可以为空的列,ORACLE性能上将⽆法使⽤该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果⾄少有⼀个列不为空,则记录存在于索引中.举例: 如果唯⼀性索引建⽴在表的A列和B列上, 并且表中存在⼀条记录的A,B值为(123,null) , ORACLE将不接受下⼀条具有相同A,B值(123,null)的记录(插⼊). 然⽽如果所有的索引列都为空,ORACLE将认为整个键值为空⽽空不等于空. 因此你可以插⼊1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE⼦句中对索引列进⾏空值⽐较将使ORACLE停⽤该索引.代码如下:低效:(索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;⾼效:(索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;4、注意通配符%的影响使⽤通配符的情况下Oracle可能会停⽤该索引。
Oracle高并发系列1:DML引起的常见问题及优化思路

Oracle高并发系列1:DML引起的常见问题及优化思路引言Oracle数据库是设计为一个高度共享的数据库,这里所说的“共享”,可以从数据库共享内存、后台进程、cursor、执行计划、latch 等方面去理解。
Oracle如此设计的目的是以最小的系统开销、最大化地支持更多的并发会话。
也是基于这个设计思想,所以Oracle单个实例的垂直扩展能力一直是DB领域内的佼佼者。
之前曾经看到PG大牛的文章分析关于Oracle的CursorPin S为什么不会在PostgreSQL里面出现,其主要原因是PostgreSQL的执行计划不是全局共享的,而Oracle里面同样的Cursor在不同session 间一般情况下都是可以共享的(Oracle在某些条件下会也触发重新硬解析)。
这样的设计客观来讲其实各有优劣,虽然PG的plan cache 是不同会话不共享的,避免了高并发时不同会话对同一个cursor产生争用,但是也意味着同样的并发会话数的情况下,PG的会话所需求的cache会更多,而且每个会话都至少要parse一次;或者反过来说同样的资源限制的前提下,Oracle支持的并发数更高。
引用一位Oracle 7的OCP,资深Oracle老司机的一段话:“早期Oracle就是使用session私有内存,但当负载并发增加时,内存消耗成了问题,而且执行计划无法共享,增加率parse时间,对于OLTP 系统parse时间的增加对于整体执行时间影响较大。
因此Oracle基于这一点进行了优化,包括session cached cursor和shared pool等,减少了SQL执行过程中的parsing time和planning time。
但没有免费的午餐,肯定会有其它消耗,类似内存结构的并发保护上的成本。
总之:1.session级SQL解析是Oracle最开始采用过的技术。
2.任何应用都要针对其所采用的数据库的特点进行好的设计。
Oracle数据库参数优化

Oracle数据库参数优化
参数优化对于Oracle数据库来说非常重要,因为它可以有效提高数据库的性能,并提供良好的可用性。
参数优化可令数据库更加稳定和高效地运行。
但是,在参数优化方面,很多初学者犯了不少错误,有些甚至会影响数据库的性能,甚至可能导致数据库出现问题。
因此,在优化参数方面,必须慎重、细心、谨慎。
首先,在参数优化之前,必须对当前参数进行全面的测试,找出需要优化的参数。
一般来说,优化可以采用两种方法,一种是优化全局参数,另一种是优化实例参数。
如果参数设置过高或者过低,可能会影响数据库的性能,因此,在参数优化时,必须按照Oracle数据库提供的最佳实践去设置参数。
最后,应该强调的是,在参数优化时,不要增加参数或者设置参数太高,并且要确保参数优化后,数据库在重要的方面有所改善,比如。
oracle优化方法总结

千里之行,始于足下。
oracle优化方法总结Oracle优化是提高数据库性能和响应能力的重要步骤。
本文总结了一些常见的Oracle优化方法。
1. 使用索引:索引是提高查询性能的主要方法。
通过在表中创建适当的索引,可以加快查询速度,并减少数据访问的开销。
但是要注意不要过度使用索引,因为过多的索引会增加写操作的开销。
2. 优化查询语句:查询语句的效率直接影响数据库的性能。
可以通过合理地编写查询语句来提高性能。
例如,使用JOIN来替代子查询,尽量避免使用通配符查询,使用LIMIT来限制结果集的大小等。
3. 优化表结构:表的设计和结构对数据库的性能也有很大的影响。
合理的表设计可以减少数据冗余和不必要的数据存储,提高查询速度。
例如,适当地使用主键、外键和约束,避免过多的数据类型和字段等。
4. 优化数据库参数设置:Oracle有很多参数可以用来调整数据库的性能。
根据具体的应用场景和需求,可以根据情况调整参数的值。
例如,调整SGA和PGA的大小,设置合适的缓冲区大小,调整日志写入方式等。
5. 使用分区表:当表的数据量很大时,可以考虑将表分成多个分区。
分区表可以加速查询和维护操作,提高数据库的性能。
可以按照时间、地域、业务等来进行分区。
6. 优化存储管理:Oracle提供了多种存储管理选项,如表空间和数据文件管理。
合理地分配存储空间和管理数据文件可以提高数据库的性能。
例如,定期清理无用的数据文件,使用自动扩展表空间等。
第1页/共2页锲而不舍,金石可镂。
7. 数据压缩:对于大量重复数据或者冷数据,可以考虑使用Oracle的数据压缩功能。
数据压缩可以减少磁盘空间的使用,提高IO性能。
8. 使用并行处理:对于大型计算或者批处理任务,可以考虑使用Oracle的并行处理功能。
并行处理可以将任务分成多个子任务,并行执行,提高处理能力和效率。
9. 数据库分区:对于大型数据库,可以考虑将数据库分成多个独立的分区。
数据库分区可以提高数据的并行处理能力,减少锁竞争和冲突,提高数据库的性能。
Oracle数据库内存优化操作说明

Oracle数据库内存优化操作说明Oracle数据库内存优化是提高数据库性能的重要手段之一。
通过设置合理的内存参数,可以有效地削减IO操作,提高数据访问速度。
本文将介绍一些常见的Oracle数据库内存优化操作。
一、调整PGA参数PGA(Program Global Area)是每个数据库会话独有的内存区域,用于存储排序、哈希操作等临时数据。
调整PGA参数可以提高排序和连接操作的性能。
1. 设置PGA_AGGREGATE_TARGET参数该参数把握PGA内存的总量,一般建议设置为SGA的1/3到1/2。
可以通过以下命令设置:ALTER SYSTEM SET PGA_AGGREGATE_TARGET=XXXM;2. 调整SORT_AREA_SIZE参数该参数把握每个排序操作使用的PGA内存大小,一般建议设置为100MB到200MB。
可以通过以下命令设置:ALTER SESSION SET SORT_AREA_SIZE = XXXM;3. 调整HASH_AREA_SIZE参数第1页/共4页该参数把握每个哈希操作使用的PGA内存大小,一般建议设置为SORT_AREA_SIZE的1/2到1倍。
可以通过以下命令设置:ALTER SESSION SET HASH_AREA_SIZE = XXXM;二、调整SGA参数SGA(System Global Area)是Oracle数据库的全局共享内存区域,用于存储缓存数据、SQL执行方案等。
调整SGA参数可以提高数据访问的速度。
1. 调整SHARED_POOL_SIZE参数该参数把握缓存SQL语句的内存大小,一般建议设置为SGA的1/4到1/3。
可以通过以下命令设置:ALTER SYSTEM SET SHARED_POOL_SIZE=XXXM;2. 调整DB_CACHE_SIZE参数该参数把握数据库缓冲区的内存大小,一般建议设置为SGA的1/2到2/3。
可以通过以下命令设置:ALTER SYSTEM SET DB_CACHE_SIZE=XXXM;3. 调整LOG_BUFFER参数该参数把握数据库日志缓冲区的内存大小,一般建议设置为10MB到100MB。
oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。
为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。
首先,减少访问数据库的次数是最基本的优化方法。
Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。
因此,尽量减少访问数据库的次数,可以有效提高系统性能。
其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。
Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。
在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。
DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。
在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。
该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。
建议将该参数设置为 200。
当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。
执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。
因此,TRUNCATE 命令执行时间短,且资源消耗少。
在使用 Oracle 时,尽量多使用 COMMIT 命令。
Oracle 索引的使用规则与性能调优

Oracle 索引的使用规则与性能调优索引分类逻辑上:Unique 唯一索引物理上:B-tree:Normal 正常型B树Bitmap 位图索引索引结构:B-tree:适合与大量的增、删、改(OLTP);不能用包含OR操作符的查询;适合高基数的列(唯一值多)典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;Bitmap:适合与决策支持系统;做UPDATE代价非常高;非常适合OR操作符的查询;基数比较少的时候才能建位图索引;树型结构:索引头开始ROWID,结束ROWID(先列出索引的最大范围)BITMAP每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID 有值;B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的5%,当然这只是个相对的比率,适用于一般的情况。
bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。
索引就好象一本字典的目录。
凭借字典的目录,我们可以非常迅速的找到我们所需要的条目。
数据库也是如此。
凭借Oracle数据库的索引,相关语句可以迅速的定位记录的位置,而不必去定位整个表。
虽然说,在表中是否创建索引,不会影响到Oracle数据库的使用,也不会影响数据库语句的使用。
这就好像即使字典没有目录的话,用户仍然可以使用它一样。
可是,若字典没有目录,那么可想而知,用户要查某个条目的话,其不得不翻遍整本字典。
数据库也是如此。
若没有建立相关索引的话,则数据库在查询记录的时候,不得不去查询整个表。
当表中的记录比较多的时候,其查询效率就会很低。
所以,合适的索引,是提高数据库运行效率的一个很好的工具。
不过,并不是说表上的索引越多越好。
过之而不及。
故在数据库设计过程中,还是需要为表选择一些合适的索引。
Oracle数据库参数优化

千里之行,始于足下。
Oracle数据库参数优化Oracle数据库参数优化是指通过调整数据库的配置参数,提高数据库的性能和稳定性。
下面是一些常见的Oracle数据库参数优化技巧:1. SGA参数优化:- 调整sga_target参数以控制SGA的大小。
SGA包括数据库缓冲区、共享池、重做日志缓冲区等,适当调整SGA的大小可以减少IO操作,提高数据库性能。
- 调整db_cache_size参数以增大数据库缓冲区的大小,提高数据块的访问速度。
- 调整shared_pool_size参数以增大共享池的大小,提高SQL语句的解析和执行效率。
2. PGA参数优化:- 调整pga_aggregate_target参数以控制PGA的大小。
PGA是用于处理SQL查询和排序的内存区域,适当调整PGA的大小可以减少磁盘IO操作,提高查询和排序的性能。
3. Redo日志参数优化:- 调整log_buffer参数以增大重做日志缓冲区的大小,减少频繁的重做日志刷新操作,提高数据库的写入性能。
- 调整log_checkpoint_timeout参数以控制重做日志刷新的频率,避免过于频繁的刷新。
4. 并行处理参数优化:- 调整parallel_max_servers参数以增大并行处理的资源限制,提高并行查询和并行DML操作的性能。
第1页/共2页锲而不舍,金石可镂。
- 调整parallel_min_servers参数以设置最小的并行处理资源数,避免并行操作的启动延迟。
5. SQL优化:- 使用合适的索引和优化的SQL语句,优化查询的执行计划。
- 使用绑定变量而不是直接将参数传递到SQL语句中,避免SQL重解析,提高性能。
6. 服务器参数优化:- 调整processes参数以增加数据库的并发连接数。
- 调整sessions参数以控制数据库的最大会话数。
- 调整open_cursors参数以增大打开游标的数量,避免游标溢出。
以上是一些常见的Oracle数据库参数优化技巧,但具体的优化策略需要根据实际情况进行调整,可以参考Oracle官方文档和专业的DBA建议。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle系统调优在Oracle数据库系统中,起到调节作用的参数叫初始化参数,在Oracle 8i及以前的版本中,这些初始化参数记录在INITsid.ora文件中;而Oracle 9i/10g/11g中将这些参数记录在SPFILEsid.ora二进制文件中基本参数:一组可调整的参数,如control_files,db_block_size,process高级参数:一组精细调整的参数,如shared_servers在进行系统优化时,可以使用alter system(整个数据库实例) /alter session(当前会话)可以使用show parameter+参数名查看系统全局区(SGA)优化,虽然11g增加了内存的自动调整调整内存分配一般内存的调整在应用程序和SQL语句做完调整后进行的。
另外,建议用户在调整I/O 前先调整内存分配。
调整日志缓冲区如何记录日志文件呢?方式一:使用逻辑的记录方式,也就是用描述性的语句记录整个变化过程。
如,对某个update,只记录delete旧值和insert新值优点:节省空间确定:一旦需要进行恢复就会非常消耗资源方式二:使用物理记录方式,也就是说,把每个数据块的改变前的镜像和改变后的镜像都记录下来优点:恢复速度快,缺点:占用很大的磁盘空间而Oracle在记录日志的方式上,采用了逻辑和物理相结合的方式。
查询当前Oracle实例的日志缓冲区大小Sys sysdba角色登录:select distinct lebsz as 日志缓冲区大小from x$kccle --必须以sys身份登录插入知识介绍:x$表x$表包含了特定实例的各方面信息,在不同版本的oracle版本中很可能是不一样的,时Oracle 数据库的运行基础,包含当前的配置信息,连接实例的会话,以及丰富价值的性能信息。
它并不是主流在数据库文件的永久或临时表x$表仅仅驻留在内存中,当实例启动时,由Oracle应用程序动态创建,在内存中进行实时的维护。
它们中的大多数至少需要装载或已经打开的数据库。
x$表为sys用户所拥有,只读,x$表对于数据库来说很重要,所以不允许sysdba之外的用户直接访问,显示的授权也不被允许调整共享池主要组件有:库缓存(library cache):主要缓存共享SQL和PL/SQL语句的相关信息数据字典缓存(data dictionary cache):缓存数据字典表(dba_tables,dba_users)等信息,用于解释权限、表结构等UGA(user globa area):在共享服务器模式下,当没有配置大池时(large_pool_size=0)UGA 会占用共享池在SGA中,首先应该考虑调整shared pool,调整shared pool时,应该首先集中在库缓存上。
如果共享池很小时,会消耗很多CPU资源并引起竞争;如果共享池很大,会消耗很多内存资源,缓冲的内容较多,此时查找也会变得较缓慢,如:通过v$librarycache来查询当前实例的库缓存在调用阶段的“请求存取数”和“不命中数"select sum(pins) 请求存取数,sum(reloads) 不命中数from v$librarycache;一般来说,库高速缓冲总不命中数与总存取数之比应当接近0。
当该比率如果接近或大于1%时,就应当立即采取措施减少这种不命中,通常有以下两种方法:1.增加初始化参数shared_pool_size,提高库高速缓存中可用的内存数量,同时为了取得好的效果,还要增加初始化参数open_cursors的值,以提高对话允许的光标数。
需要注意的是:为库缓存分配太多的内存可能引起调页或交换2写等价的SQL语句,尽可能让SQL语句和PL/SQL块共享一个SQL区,以减少库缓存的不命中。
SQL语句或PL/SQL块的文本每一个字符都必须等价,包括大小写和空格v$rowcache查询数据字典高速缓存的活动状况如:通过v$rowcache动态性能视图查询当前实例的数据字典高速缓存在调用阶段的“请求存取数”和“不命中数”select sum(gets) 请求存取数,sum(getmisses) 不命中数from v$rowcache;一般来说,数据字典高速缓存总不命中数与总存取数之比应当接近0,改比率如果大于10%,甚至在应用过程中该比率还在增长,就应当立即通过增加shared_pool_size,以提高数据字典可用的内存数量,从而减少这种不命中。
v$sesstat v$statname查询Oracle收集对话信息使用的总内存统计如:显示当前分配给所有会话的内存数select sum(value)||'字节' 当前分配给所有会话的内存数from v$sesstat,v$statnamewhere name='session uga memory' and v$sesstat.statistic#=v$statname.statistic#;session uga memory用于显示分配给对话的内存字节数如:显示曾经分配给所有会话的最大内存数select sum(value)|| '字节' 曾经分配给所有会话的最大内存数from v$sesstat,v$statnamewhere name='session uga memory max' and v$sesstat.statistic#=v$statname.statistic#;调整数据库缓冲区Oracle启动后不断地收集和统计数据存取的情况,并将其存放在v$sysstat中,有:db block gets:该统计值为数据请求的总数consistent gets:该统计值为通过内存缓冲区存取既能满足的请求书physical reads:该统计值为磁盘文件存取的总数如:查询一段时间内v$sysstat表中的统计信息select name,value from v$sysstat where name in('db block gets','consistent gets','physical reads');计算缓冲区高速缓存的命中率可以使用1-physical reads/(db block gets+consistent gets)如果命中率还不错,可以适当减少初始化参数db_block_buffers的值减少高速缓存的大小,从而可以将省出来的内存用于其他Oracle内存结构。
如果命中率低于70%,就会造成性能下降,这时应该立即通过增加初始化参数db_block_buffers的值(最大为65535)来增加缓冲区高速缓存的大小排序区优化系统使用专用的内存区域进行数据排序,这部分空间就是排序区。
在Oracle中,用户数据的排序可使用两个区域:一个是内存排序区;另一个是磁盘临时段,系统优先使用内存排序区进行排序,如果内存不够,Oracle会自动使用磁盘临时表空间进行排序,为了提高数据库排序的速度,建议尽量使用内存排序区,而不使用临时段。
sort_area_size用来设置排序区大小。
如果增大排序区则会提高大规模排序的性能,因为可以借此在查询处理期间在内存中执行排序。
排序区的大小十分重要,因为某时用于每个连接的排序区仅有一个。
此init.ora 参数默认值通常为6-8个数据块的大小,此值通常主要用于OLTP操作,此时应该将其增大,以便执行决策支持操作、大批量操作,或者大量索引相关操作(如重建索引)。
执行上述操作,应该调整下列init.ora参数:sort_area_size=65535sort_area_retained_size=65535排序活动排序是SQL语法中很小的方面,但却很重要,在Oracle的调整中,它常常被忽略。
当使用create index,order by ,group by等语句时,Oracle数据库将自动执行排序的操作。
通常,在以下情况Oracle会进行排序操作:1.创建索引时2.使用order by3.使用group by4.进行table join时,由于现有索引的不足而导致SQL优化器调用merge sort当在Oracle实例中建立起一个session时,在内存中就会为session分配一个私有的排序区域。
如果该连接是一个专用连接,那么就会根据init.ora中的sort_area_size参数的大小在内存中分配一个PGA.如果连接时通过多线程服务器建立的,那么排序的空间就在large_pool 中分配。
然而,对所有的session用做排序的内存量必须是一致的,不能为需要更大排序的操作分配额外的排序区域。
因此,设计者必须做出平衡,在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序的同时,对于那些并不需要进行很大排序的任务,就会出现浪费。
当然,当排序的空间需求超出了sort_area_size所设置的大小时,将会在temp表空间中分页进行磁盘排序。
磁盘排序要比内存排序大概慢14000倍私有排序区域大小是由init.ora中的sort_area_size参数决定的。
每个排序所占用的大小由init.ora中的sort_area_retained_size参数决定的。
当排序不能在分配的空间中完成时,就会使用磁盘排序方式,即在Oracle实例中的临时表空间中进行磁盘排序的开销是很大的,主要有以下几个原因:首先,与内存排序相比,磁盘排序特别慢,而其磁盘排序会消耗临时表空间的资源。
其次,Oracle必须分配缓冲池以保持临时表空间中的块。
无论何时,内存排序都比磁盘排序好,磁盘排序将会使任务变慢,并且会影响Oracle实例当前任务的执行。
此外,过多的磁盘排序会使空闲缓存的等待(free buffer waits)值变得很高,从而令其他任务的数据块由缓冲区移走。
专用模式下排序区的调整sort_area_size:除非在共享模式下,一般不推荐设置该参数,而推荐使用pga_aggregate_target进行PGA 内存自动管理。
如果需要设置此参数,可以考虑设置在1-3MB之间sort_area_retained_size:它指定了在排序操作完成后,继续保留在uga(用户全局区)内存的最大大小,以维护内存中的排序,直到所有数据行被返回才释放(sort_area_size在排序完成,数据行返回之前被释放)回uga(不会被操作系统回收)。
sort_area_retained_size在共享服务中是从SGA中分配的(因为此时uga是从sga中分配的),在专用服务模式中是从pga中分配的,而sort_area_size无论在哪种模式下都从pga中分配同样设置了pga_aggregate_target后,该参数无效当连接处于空闲时,后台进程PMON每隔一段时间,就会测试用户的连接状况,如果连接已断开,PMON会清理现场,释放相关的资源。