重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
您好,我在别的论坛也看到了您的提问,很高兴为您解答:
创新互联于2013年开始,是专业互联网技术服务公司,拥有项目成都网站制作、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元呼图壁做网站,已为上家服务,为呼图壁各地企业和个人服务,联系电话:18982081108
查看oracle参数是静态或者是动态[@more@]
select name,value,ISSYS_MODIFIABLE from v$parameter where ISSYS_MODIFIABLE ='IMMEDIATE' order by name ;--动态参数
select name,value,ISSYS_MODIFIABLE from v$parameter where ISSYS_MODIFIABLE ='FALSE' order by name ; ----静态参数,需要重启数据库参数才有效
select name,value,ISSYS_MODIFIABLE from v$parameter where ISSYS_MODIFIABLE ='DERERRED' order by name ;--延迟,当前会话不生效,后续的会话有效
如果我的回答没帮助到您,请继续追问。
查询优化器参数
1. optimizer_mode
查询优化器是为了找一个最高效的执行计划,这个参数用来定义什么是“高效”,比如是更快还是占用资源更少。在oracle10g中只支持两个参数值:
all_rows:提供全部数据
first_rows(n):n为大于0的自然数,表示尽快传输前面n条数据(比如分页查询的时候,我第一次只查询前面10条数据)
oracle10g默认为all_rows,可以再数据库级别,会话级别,或者执行SQL的时候修改该参数的值。
数据库级别:alter system set optimizer_mode=first_rows(10) scope=spfile;
会话级别:ALTER SESSION SET OPTIMIZER_MODE=first_rows(10);
SQL级别:SELECT /*+ first_rows(10) */ id,name from t1 order by id;
其实,默认all_rows是最好的方式,如果确实是只要查询小部分数据,可以在sql级别加上提示,看是否能提高性能。
2. db_file_multiblock_read_count
在多块读的情况下(比如全表扫描),该参数说明一次最多可读取的数据块数目。设置得太小的话,效率低。设置得太高也不见得就好(太高,会受I/O最大吞吐量限制。比如设置成一次最多读取1024块,但I/O最大吞吐量只允许32块,那一次最多也只读取32块。而且一次读取很多块,开销会偏高。)应该通过测试,才能知道应该把该参数设置成哪一个值。
测试过程:
1. 创建一张大表,比如上千万行级别的数据
2. 循环设置该参数的值,查看全表扫描的速度。类似于以下语句:
[sql] view plain copy
span style="font-size:14px;" declare
l_count pls_integer;
l_time pls_integer;
l_starting_time pls_integer;
l_ending_time pls_integer;
begin
dbms_output.put_line('dbfmbrc seconds');
for l_dbfmbrc in 1..32
loop
execute immediate 'alter session set db_file_multiblock_read_count='||l_dbfmbrc;
l_starting_time := dbms_utility.get_time();
select /*+ full(t) */ count(*) into l_count from big_table t;
l_ending_time := dbms_utility.get_time();
l_time := round((l_ending_time-l_starting_time)/100);
dbms_output.put_line(l_dbfmbrc||' '||l_time);
end loop;
end;
//span
3. optimizer_index_cost_adj
影响走索引扫描的开销计算。 取值范围1到10000.默认值为100,超过100后,走索引扫描的开销越高,从而使得查询优化器更加倾向于使用全表扫描。相反,小于100,索引扫描的开销就越低,从而使得查询优化器更加倾向于使用索引扫描。从下面索引扫描开销计算公式可以看出:
io_cost=(blevel+(leaf_blocks+culstering_factor)*selectivity) *optimizer_index_cost_adj/100.
一般是默认值不需要修改,但是如果发现本应该走索引扫描结果走了全表扫描,可以适当调低该值,但是,这个值不应该设置过低,因为,过低的话,如果两个索引扫描的开销不同,可能通过该公式一算,开销就变成一样的了。总之,不建议修改该参数的值。
PGA参数
1. workarea_size_policy
管理工作区域内存(PGA)的方式,
auto:oracle10g默认方式,委托给内存管理器自动管理(建议不需要修改)
manual:oracle9i默认方式,oracle9i没有自动管理功能。
2. pga_aggregate_target
如果是自动管理PGA,那么该参数用于指定实例可用的PGA的大小,默认是SGA的20%。即使今后用的内存超过了设置的值,也没有关系,oracle会自动增大PGA的值。比如该参数设置的是200M,今后某一时刻,需要300M,也是没问题的,会自动增长。
3. sort_area_size
手动管理PGA,该参数指定分配多大的内存用于排序操作,过小的话,会影响性能,过大的话浪费空间。很难说一个合适的默认值,因为用户场景变化非常大,实际情况得实际处理。
4. hash_area_size
手动管理PGA,该参数用于指定哈希连接的工作区域大小,同样建议它的值也很困难。如果过小,那么查询优化器就会高估哈希连接的开销,偏向于合并连接。
我们一般修改到1000~1500,就好了,再大也没有什么用处了。
一般和你机器的内存有关:
给你copy一段:
ORACLE最大连接数问题
(2010-09-08 20:27:17)
转载▼
标签:
oracle优化
it
分类: 多少会点
oracle 10g安装在windows 2003 32位操作系统,连接数到120个就不能连接,报ora12518
服务器IBM XSERVER,内存:4G
oracle 数据库配置的主要参数如下:
processes integer 800
sessions integer 885
pga_aggregate_target big integer 350M
sga_max_size big integer 1256M
sga_target big integer 1152M
shared_pool_size big integer 400M
large_pool_size big integer 16M
数据库配置的连接数是800个,但是现在当oracle的连接数达到250个时候,其他的客户端就无法再连接上oracle服务器了,报个错:ORA-12518: TNS: 监听程序无法分发客户机 ;
但是已经连接上数据库的应用还可以正常应用,就是其他没连上的就再也连不上了,除非已有的连接有退出的,其他的才能再联上,就是可连接的总数是250个;
上网查:说是在可以在listener.ora中加入一行: direct_handoff_ttc_listener name=off,但是依旧不成;
这期间我尝试着把
pga_aggregate_target 改成200或者500等,结果是一样的;
sga_target改成800m后,结果数据库就起不来了,提示说要不能小于1024m;
后来查到有可能是oracle 10g for win32的一个bug,上网下了补丁,打完补丁后的版本是:10.2.0.3);还怀疑是不是windows 2003的tcp连接数不够,上网查说好像是有这毛病,下了个2003的补丁,把tcp连接数扩到了1000,结果能够达到可以有350个并发连接,但是再多就又连不上了;
现在就是不太清楚究竟是什么参数配置的不合适,(不管是oracle10g的,还是windows 2003的),才会造成实际上没有达到oracle设置的最大连接数时就不能连接了;
又后来,怀疑是不是windows 2003(32位)的问题,于是就装了个64位的windows 2003,同样版本的oracle 10g,装好后就把连接数process参数配置成800,然后做连接测试,一直可以有800个session连接上来,到现在为止,可以大致总结出症结所在了,就是我装的这个windows 2003 server(32位)的操作系统,在安装oracle 10g(10.2.0.1-10.2.0.3)时有问题,连接数不能达到系统配置的那么大;可以采用64位的替代。但是我在想,究竟为什么windows 2003 server(32位)的操作系统+oracle 10g数据库连接数会有限制,有没有什么办法,修改一下2003的配置或者oracle 10g的配置, 就可解决掉这个问题,
解决方案:
一、修改oracle参数
1、原有参数
#pga_aggregate_target=67108864
#processes=500
#sessions=555
# pga_aggregate_target此参数是扩大并发连接数占用内存大小。
# 可调整此参数,放大或缩小,同时影响并发数量。
# 公式: 约=可按照并发数量*4M
pga_aggregate_target=720M
# processes、sessions是扩大并发连接数,是同时使用。
# 公式: sessions = processes *1.1 +5
processes=600
sessions=665
2、在监听参数文件LISTENER.ORA 文件中增加参数
direct_handoff_ttc_listener = off
3、重新启动数据库服务。
二、1、修改Windows系统中Boot.ini文件
/3GB /PAE
说明:修改操作系统中Boot.ini文件,可以使oracle使用更多的内存空间。
2、修改用户组策略中锁定内存页大小权限。
参数修改完毕问题解决。
3、重启计算机。
你查看的是初始化文件initorcl.ora,initorcl.ora记录了控制文件的路径。所以内容是正确的
。
你可以
create
pfile='e:\oracle\aaa.ora'
from
spfile;
然后查看e:\oracle\aaa.ora文件
这里记录就是你的参数,可以修改
接着通过pfile文件生成spfile文件
create
spfile
from
pfile=='e:\oracle\aaa.ora';
启动数据库就可以了
pfile是文本的,可以修改,但修改后数据库必须重新启动才生效。
spfile是二进制的,不可以手工修改,可以在线修改参数,不需要重新启动数据库。