如:
SQL> show parameter pga_aggregate_target NAME TYPE VALUE ------------------------------------ ----------- -------- pga_aggregate_target big integer 10485760 SQL> show parameter workarea_size_policy NAME TYPE VALUE ------------------------------------ ----------- ------ workarea_size_policy string AUTO |
而Pga由三部分构成,其中有可以配置的 sort_area_size,还有会话信息,堆栈空间。
sort_area_size是用户用来排序的内存空间:
sort_area_size是用户用来排序的内存空间: SQL> show parameter sort_area_size NAME TYPE VALUE ------------------------------------ ----------- ------ sort_area_size integer 524288 |
如果排序的数据量比较大,排序空间不够用,这时Oracle通过专用算法,对数据进行分段,分段后的数据转移到临时表空间中,在临时表空间中进行排序,完成后,再合在一起,返回给请求的用户。这是大排序为什么使用临时表空间的原因。
在专用连接中,连接所需要的资源全部在PGA中分配。该内存区为指定连接私有,其它进程不能访问。
专用连接采用一对一的连接方式,能很的响应用户的请求,但是,如果连接用户太多时,由于要对每一个连接分配资源,因此,连接数受硬件限制比较大。为了克服这种情况,Oracle 提出了共享连接的连接方法,即用一个服务器的进程响应多个用户连接,与专用连接不同有连接时才创建PGA不同,共享连接在实例一启动,就分配指定数量的服务器进程,所用户的连接,以排队的方式,由分配器指定给服务器进程,其它的进程排队等待。只要用户的请求一执行完,就会马上断开连接,分配器会把空闲的服务器进程分配给其它排除的进程。
采用共享连接可以有效的提高服务器资源的利用率,但是对一个分配器,只支持一种协议,每个分配器有自已的排队队列,在请求的任务完成后,由分配器将操作结果返回给相应的用户进程。但是共享连接的建立, 需要Oracle的监听进程、分配器、共享服务器进程才能共同完成一个连接的创建,所以连接的分配也需要一定的时间和资源。
在共享连接中,sort_area_size 将在 SGA 的 Large_pool 中分配。
上面所说的是两种连接的创建方法和管理方法,在理想的情况下,对于长事务或大事务,使用专用连接,可以有效的提高系统的性能,减少用户等待和事务的排队,提高系统的利用率。对于超短事务和短事务、小事务,使用共享连接方式,可以在资源与效率之间达到一种平稀。比如对于OLTP 系统,使用专用连接,而对于网站等,可以使用共享连接。
那么,能不能在OLTP系统中使用共享连接呢?如果能使用,那么,能不能提高性能呢?
OLTP系统,一般而言,有较多的长事务和大事务,如用户的某几步操作,必须作为一个事务。对于这种情况,我们分析一下,看看,会发生什么样的情况:
分析首先有一个前提,那就是用户请求数要大于共享服务器进程数,否则,减去分配器管理性能支出,共享连接的性能要低于专用连接。
如果用户请求数大于共享服务器进程数,那么肯定有请求是在排队,假定目前一个共享服务器进程正在执行一个长事务,那么请求队列就要一直等,直到当前的事务结束。从用户请求的角度看,很明显,响应的时间加长了。从服务器角度看,我们先看一下由网友 WESTLIFE_XU 提供的实例:
共享连接和长事务是背道而驰的,长事务的共享连接会造成shared 进程的严重排队,造成性能的严重下降,给你看一个极端的例子,以前的同事公司的。
代码:
=780) window.open('http://oracle.topsage.com/UploadFiles_7269/200711/20071113091251419.jpg');" src="http://oracle.topsage.com/UploadFiles_7269/200711/20071113091251419.jpg" onload="javascript:if(this.width>'780')this.width='780';setTimeout('if(document.getElementById(\'http://oracle.topsage.com/UploadFiles_7269/200711/20071113091251419.jpg\').height>\'700\')document.getElementById(\'http://oracle.topsage.com/UploadFiles_7269/200711/20071113091251419.jpg\').height=\'700\';',500);" border=0>
举个例子,200个request共享比说10个共享进程,每个shared进程在一个时间内只能处理一个request,也就是说10个进程在同一时间内只能处理10个request,如果一个request需要很长的处理,会造成其它请求的严重排队。
shared进程要求客户端的每个request要特别快,如果客户端的一个request就占了很长时间,那别的request就得一直等着,共享就没有什么意义了。
从上面可以看出,如果在有大事务和长事务的OLTP系统中,系统会比原来更慢!
综合来看,共享连接和专用连接各有所长,关键是看应用,能适用于自已应用的连接方式,就是好方式。
1.修改初始化参数文件,加入如下内容
或用alter system 命令修改spfile
shared_servers=3--初始共享服务器进程数,设置为0表示关闭共享服务器模式
max_shared_servers=39--最大共享服务器进程数
dispatchers="(protocol=TCP)(serv=orcl)(list=orcl)(poo=on)(disp=5)(conn=33)(sess=224)"
protocol=tcp--协议
list=orcl--监听器别名,并非监听器的名字,实际是一个tnsnames.ora中的网络服务名
serv=orcl--网络服务名
poo=on--是否启用共享池
disp=5--初始调度进程数
sess=224--每个调度进程的最大会话数
max_dispatchers=19--最大调度进程的数
2.如果修改的是pfile需要重启数据库,如果修改的spfile不用重新启动
3.查看设置的参数是否生效
show parameter shared_servers
show parameter disp
select * from v$shared_server;
select * from v$dispatcher;
4.设置成功后默认连接为共享连接
select server from v$session;
5.当执行某些管理命令是oracle要求必须是专用服务器连接,仍然可以指定连接方式
修改tnsnames.ora文件,在connect_data节点下添加(server=dedicated)即可
6.修改共享服务器进程数量
alter system set shared_server=new_number;
7.修改调度进程数量
alter system set dispatchers="(protocol=tcp)(disp=6)" scope=both;
8.关闭指定的调度进程
select name from v$dispatcher;
alter system shutdown immediate 'name';
9.把服务器从共享服务器模式改为专用服务器模式
alter system set shared_servers = 0 scope = both;--已经存在的共享进程需要等到会话结束才能结束
或
alter system set max_share_servers=0 scope=both;--立即强制结束所有共享服务器进程