美文网首页linux redhat & Oracle
编码硬解析的改进方法

编码硬解析的改进方法

作者: 重庆思庄 | 来源:发表于2019-07-02 16:07 被阅读0次

1.更改参数cursor_sharing

        参数cursor_sharing决定了何种类型的SQL能够使用相同的SQL area

        CURSOR_SHARING = { SIMILAR | EXACT | FORCE }   

            EXACT      --只有当发布的SQL语句与缓存中的语句完全相同时才用已有的执行计划。

            FORCE      --如果SQL语句是字面量,则迫使Optimizer始终使用已有的执行计划,无论已有的执行计划是不是最佳的。

            SIMILAR    --如果SQL语句是字面量,则只有当已有的执行计划是最佳时才使用它,如果已有执行计划不是最佳则重新对这个SQL

                       --语句进行分析来制定最佳执行计划。

        可以基于不同的级别来设定该参数,如ALTER SESSION, ALTER SYSTEM

            sys@ASMDB> show parameter cursor_shar             --查看参数cursor_sharing

            NAME                                 TYPE        VALUE

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

            cursor_sharing                       string      EXACT

            sys@ASMDB> alter system set cursor_sharing='similar';    --将参数cursor_sharing的值更改为similar

            sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;   

            NAME                      CLASS      VALUE

            -------------------- ---------- ----------        --当前硬解析的值为865

            parse count (hard)           64        865

            scott@ASMDB> select * from dept where deptno=10;

            sys@ASMDB> select name,class,value from v$sysstat where statistic#=331; 

            NAME                      CLASS      VALUE

            -------------------- ---------- ----------        --执行上一条SQL查询后,硬解析的值变为866

            parse count (hard)           64        866

            scott@ASMDB> select * from dept where deptno=20;

            sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;

            NAME                      CLASS      VALUE

            -------------------- ---------- ----------        --执行上一条SQL查询后,硬解析的值没有发生变化还是866

            parse count (hard)           64        866

            sys@ASMDB> select sql_text,child_number from v$sql   -- 在下面的结果中可以看到SQL_TEXT列中使用了绑定变量:"SYS_B_0"

              2  where sql_text like 'select * from dept where deptno%';

            SQL_TEXT                                           CHILD_NUMBER

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

            select * from dept where deptno=:"SYS_B_0"                    0

            sys@ASMDB> alter system set cursor_sharing='exact';       --将cursor_sharing改回为exact

            --接下来在scott的session 中执行deptno=40 和的查询后再查看sql_text,当cursor_sharing改为exact后,每执行那个一次

            --也会在v$sql中增加一条语句

            sys@ASMDB> select sql_text,child_number from v$sql               

              2  where sql_text like 'select * from dept where deptno%';

            SQL_TEXT                                           CHILD_NUMBER

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

            select * from dept where deptno=50                            0     

            select * from dept where deptno=40                            0

            select * from dept where deptno=:"SYS_B_0"                    0

        注意当该参数设置为similar,会产生不利的影响,可以参考这里:cursor_sharing参数对于expdp的性能影响

相关文章

网友评论

    本文标题:编码硬解析的改进方法

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