美文网首页oracle
相老师的OCP教程 11-15课 文字版

相老师的OCP教程 11-15课 文字版

作者: fjxCode | 来源:发表于2018-07-12 20:53 被阅读6次

    甲骨论11课SQL语句解析类型硬解析软解析

    SQL语句执行过程:parse-execute-fetch

    sharedPool组成:

    l  Free空间

    l  Library库缓存:保存库和执行计划

    l  rowCache字典缓存:保存Oracle数据信息,如数据库的表数、用户数等。

    数据字典的作用:(需要多了解数据字典表)

    1)            #sqlplus / as sysdba

    2)            >Create table t1 as select *from dba_objects;拷贝建立一个表

    3)            >desc dba_tables

    4)            >select table_name,OWNERfrom dba_tables where table_name like ‘T1%’

    查看共享池内存:

    1)            #select * from v$sgastat awhere a.pool =’shared pool’ and a.NAME=’free memory’

    2)            #select * from v$sgastat awhere a.NAME=’library cache’

    3)            #select * from v$sgastat awhere a.NAME=’row cache’

    SQL解析类型:硬解析(bufferCache无缓存有执行方案)、软解析、软软解析(也称不解析)。

    硬解析的执行方案选优最消耗资源。软解析不需要执行方案选优,

    #selectname,value from v$sysstat where name like ‘parse%’ //查看解析中硬解析数量,解析失败数量。

    甲骨论12课shared内存块组成结构及4031错误产生原因分析

    内容:chain、trunk、硬解析/软解析过程、ora4031错误。

    sharedPool内存块组成:Oracle只能总体设置sharedPool大小,不能单独libraryCache或rowCache大小。Free空间的内存块挂在链上,小内存块在链前,大内存块在链后。只有硬解析使用Free空间,Free空间中过多的小内存块遇到需要大内存块的长sql语句,就会出现硬解析失败Ora4031错误。

    硬解析失败Ora4031错误原因:

    l  过多硬解析,Free空间不足

    l  Free空间碎片(小内存块)过多,而需要大内存块的硬解析。

    Free空间中链chain的作用:Free空间通过链的遍历找到内存块。使用锁latch保护共享池中空闲空间中的链。

    libraryCache中挂链的方法是:sql语句转为ASCII码,转为Hash值,转为数字,转为链编号。libraryCache中内存块按Hash值排序,这与Free中按内存块大小排序的方式不同。

    Ora4031错误检查语句:

    l  #select count(*) from x$ksmsp //检查libraryCache中的trunk数

    l  #selec count(*) from dba_objects //任意执行一条未执行的语句,触发硬解析

    l  #select count(*) from x$ksmsp //

    l  #alter system flush shared_pool //清空libraryCache和rowCache,执行后Free空间的碎片减少,ora4031错误减少,同时会带来大量的硬解析。此命令只能缓解ora4031错误,解决还需要优化数据库结构。

    l  #select name,value from v$sysstat where name like ‘parse%’ //查看软硬解析具体情况

    方法:检查两次trunk数,计算一段时间内增加trunk数。产生trunk数少说明系统很稳定(硬解析少),多则说明硬解析较多。也可以用v$sysstat查看。

    甲骨论13课共享SQL减少硬解析

    硬解析缺点:消耗资源、出现ora4031错误。完全相同(包括空格大小写)的sql语句才能共享,才能软解析。

    #selectsql_id,sql_text,excecutions from v$sql where sql_text like ‘%hello%’ //查看sql语句的sql_id

    避免硬解析方法:

    l  统一书写风格

    l  变量不同的使用绑定变量,将sql语句分为动态部分和静态部分。

    1)            >declare v_sql varchar2(50);

    2)            >begin for I in 1..10000loop

    3)            >v_sql :=’insert /hello/into test values (:1)’;

    4)            >execute immediate v_sqlusing I;

    5)            >end loop;

    6)            >commit;

    7)            >end;

    >show prarmeter cursor //显示cursor sharing参数

    >alter system set session_cached_cursors=150 scope=both; //改cursors参数

    甲骨论14课如何解决ORA4031错误

    找出没有共享的SQL语句:

    1)            >select SQL_FULLTEXT fromv$sql where EXECUTIONS=1 and sql_text like ‘%from t%’; //找只执行一次的变量

    2)            >spool 1.1st

    3)            >select SQL_FULLTEXT fromv$sql where EXECUTIONS=1 order by sql_text;

    4)            >spool off

    5)            >exit

    查看解析命中率(要求运行稳定后命中率90%以上):

    1)            >selectsum(pinhits)/sum(pins)*100 from v$librarycache; //library命中率,一般出问题较多

    2)            >selectsum(gets),sum(getmisses),100*sum(gets-getmisses)/sum(gets) from v$rowcachewhere gets>0; //rowcache命中率

    解决ora4031错误的方法:

    1)            >alter system flushshared_pool;

    2)            共享SQL

    >alter system set cursor_sharing=’force’;

    >show parameter cursor;

    这种方法只能在共享SQL中的强制绑定变量,不能解决书写规范问题。

    3)            使用dbms_shared_pool.keep包

    >@?/rdbms/admin/dbmspool.sql //执行sql语句,产生对象dbms_shared_pool.keep

    >select * from v$db_object_cache where sharable_mem>10000

    and (type=’PACKAGE’ or type=’PACKAE_BODY’ ortype=’FUNCTION’ or type=’PROCEDURE’) and kept=’NO’//查看占内存较大的sql语句

    > //强制keep到内存中

    4)            保留区

    >select REQUEST_MISSES from v$shared_pool_reserved; //如果发现“保留区请求失败次数REQUEST_MISSES”

    >show paremeter shared //显示共享池保留空间

    5)            增加shared_pool空间

    >select COMPONENT,CURRENT_SIZE fromV$SGA_DYNAMIC_COMPONENTS;

    >show parameter sga_target

    >show parameter sga_max_size

    >alter system set shared_pool_size=150M scope=both;

    从oracle10后,只需要设定6个池共享空间sga_target,由oracle分配各个池大小。此参数设定需要重启oracle。sga_target_max参数可以防止sga_target设置过大导致系统死机。

    1)            >show parameter shared_pool;//查看共享池设置值

    2)            >alter system setshared_pool_size=20; //设置共享池的值

    3)            >select COMPONENTCSURRENT_SIZEfrom V$SGA_DYNAMIC_COMPONENTS; //查看共享的池的实际值

    若共享池大小设置小于sga_target分配,则不会被采纳。注意到从V$SGA才显示共享池实际值。

    甲骨论15课如何设置shared_pool及sga大小

    共享池过大的坏处:

    l  只执行一次的sql语句(没有享受到共享)也进行共享机制(到libraryCache查找,解析,Free空间中找空trunk,写入解析内容,挂到libraryCache上),还不如直接硬解析,不查找不缓存不挂链快速。

    l  共享池过大,libraryCache链长遍历比较慢。

    shared_pool大小设置:

    l  使用脚本算:共享池大小-反应时间曲线

    l  EM-指导中心-内存指导-SGA建议大小

    查看执行计划:

    1)            >sql语句

    2)            >select sql_id,sql_text fromv$sql where sql_text like ‘%语句%’; //取得sql_id

    3)            >select * fromtable(dbms_xplan.display_cursor(‘sql_id’)); //显示执行计划

    后面的内容讲执行计划。

    相关文章

      网友评论

        本文标题:相老师的OCP教程 11-15课 文字版

        本文链接:https://www.haomeiwen.com/subject/odxdpftx.html