Oracle dbms_shared_pool keep固定执行计划到缓存

 

dbms_shared_pool keep对象到share pool中


对于一些大值对象装载进共享池时容易引发两种类型的问题:
        ORA-04031 errors 由于没有足够的内存引发该类似的错误
        为大值对像寻找可用的空间而引发系统性能下降
    将大值对象在实例启动时装载进共享池可以避免上述问题。
   

    对于已经固定在内存中的包,在关闭数据库之前,该对象会被一直保留,不会清除或失效。
        需要访问DBMS_SHARED_POOL这个包的任何用户都必须由SYS授予执行权限。

        如果在SYS模式中创建的包并在不同的模式中运行示例代码,则首先必须给运行示例(即TEST)的用户授予EXECUTE_CATALOG_ROLE
    角色且在DBMS_SHARED_POOL上给TEST以EXECUTE权限,然后需要在SYS.DBMS_SHARED_POOL.KEEP中完全地限定这个包,因为dbmspool.sql
    脚本并不为这个包创建公有同义词。   

  
一、安装(DBMS_SHARED_POOL缺省并没有随系统安装)

        要使用这个过程,首先必须运行DBMSPOOL.SQL脚本。在启动DBMSPOOL.SQL脚本后,PRVTPOOL.PLB脚本将自动执行。这些脚本不能
        使用CATPROC.SQL来运行。

      
    2.以sys帐户安装DBMS_SHARED_POOL包

        SQL> show user;
        USER is "SYS"
        SQL> @?/rdbms/admin/dbmspool.sql
        Package created.
        Grant succeeded.
        View created.
        Package body created.

    3.查看包包含的存储过程

        SQL> desc dbms_shared_pool

        PROCEDURE ABORTED_REQUEST_THRESHOLD
         Argument Name                  Type                    In/Out Default?
         ------------------------------ ----------------------- ------ --------
         THRESHOLD_SIZE                 NUMBER                  IN

        PROCEDURE KEEP

         Argument Name                  Type                    In/Out Default?
         ------------------------------ ----------------------- ------ --------
         NAME                           VARCHAR2                IN
         FLAG                           CHAR                    IN     DEFAULT

        PROCEDURE PURGE

         Argument Name                  Type                    In/Out Default?
         ------------------------------ ----------------------- ------ --------
         NAME                           VARCHAR2                IN
         FLAG                           CHAR                    IN     DEFAULT
         HEAPS                          NUMBER                  IN     DEFAULT

        PROCEDURE SIZES

         Argument Name                  Type                    In/Out Default?
         ------------------------------ ----------------------- ------ --------
         MINSIZE                        NUMBER                  IN

        PROCEDURE UNKEEP

         Argument Name                  Type                    In/Out Default?

         ------------------------------ ----------------------- ------ --------

         NAME                           VARCHAR2                IN
         FLAG                           CHAR                    IN     DEFAULT
————————————————


将SQL语句常驻内存

        对于单独的SQL语句,且被经常使用,同样可以将其常驻内存。

        此时,需要得到SQL语句的hash值,我们可以通过$sqlarea里的address和hash_value列获得

        SQL> select count(*) from all_objects;

        COUNT(1)
        --------
           40793     

        SQL> select address,hash_value,sql_text from v$sqlarea where sql_text='select count(*) from all_objects';

        ADDRESS       HASH_VALUE SQL_TEXT
        -------- --------------- ----------------------------------------
        2D33FF58      789896629 select count(*) from all_objects 

        SQL> exec sys.dbms_shared_pool.keep('2D33FF58,789896629','C');  

        PL/SQL procedure successfully completed.

        如果我们要取消固定到内存的话,则调用DBMS_SHARED_POOL.UNKEEP即可,该过程的参数与KEEP相同。

    4.清空share pool的命令(如果在使用包keep对象没有可用空间时,可以flush shared_pool)

        ALTER SYSTEM FLUSH SHARED_POOL    --此操作不会清除常驻内存的对象

    5.查看当前已经常驻内存的对象

        select * from v$db_object_cache where kept='YES'       

    6.寻找较大匿名的PL/SQL 块将其分割为小的PL/SQL块,以提高共享池的利用率

        SELECT sql_text

        FROM v$sqlarea

        WHERE command_type=47

        AND LENGTH(sql_text)>500;
—————————————

 

posted on 2021-04-21 09:18  数据与人文  阅读(416)  评论(0编辑  收藏  举报