Oracle有两种工作方式:
1. dedicated server;
一个连接对应一个server process。连接的请求得到最及时的相应。
2. shared server;
多个连接由调度进程随机分配,连接被放入SQL队列,6个server process不断轮询从SQL队列中取出SQL执行。Despatcher只是调度的作用,起负载很小,主要的负载在server process上。适合于数据库的连接量非常大,同时每一个连接负载又很小的情况(电商网站)。
PGA的管理方式有两种:
1. 手动,手动的设置sort_area_size, hash_area_size, bitmap这三个区的大小;手动设置不够灵活,常常出现内存不够或者内存空余的情况。
Oracle有两大dbf文件:一是临时(temp)dbf,二是数据(data)dbf。如果设定sort_area_size的大小是2M,当需要排序的数据量大于2M时,oracle就会启用临时dbf,先把一部分数据写入临时dbf,对另一部分数据进行排序,排序完成之后再把临时dbf的数据读入进行排序。这有点像swap内存区。不需要临时dbf时叫做完全内存排序,使用临时dbf时叫做磁盘排序。磁盘排序的速度很慢。
2. 自动,只需给所有的server process分配一个大的PGA空间就可以了。每个server process建立的时候都会从PGA里申请一块空间,不够用时会接着申请,用完就释放。每个server process获得的空间是弹性的。
设置PGA为自动管理:
SQL> alter system set workarea_size_policy=auto scope=both; System altered.
设置总的PGA大小:
SQL> alter system set pga_aggregate_target=512m scope=both; System altered.
在OLTP系统中,一般而言PGA大小为物理内存的80%再乘以20%。
OLTP:PGA_aggregate_target =(total_mem * 80%) * 20%。
在DSS系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。
DSS:PGA_aggregate_target =(total_mem * 80%) * 50%。
查看PGA的大小:
SQL> show parameter pga; NAME TYPE -------------------------------------------------------------------- VALUE ------------------------------ pga_aggregate_target big integer 512M
查看server process每个区的大小:
SQL> showparameter area; NAME TYPE -------------------------------------------------------------------- VALUE ------------------------------ bitmap_merge_area_size integer 1048576 create_bitmap_area_size integer 8388608 hash_area_size integer 131072 sort_area_retained_size integer 0 sort_area_size integer NAME TYPE -------------------------------------------------------------------- VALUE ------------------------------ 65536 workarea_size_policy string AUTO