当cusor_sharing=similar时,在收集了直方图的列上进行非等查询时,进行硬解析

SQL> show parameter cursor_sh

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------------------
cursor_sharing                       string                           SIMILAR

SQL> SELECT COUNT(*)
  2     FROM USER_HISTOGRAMS
  3   WHERE TABLE_NAME = 'T1'
  4      AND COLUMN_NAME = 'HEADER_BLOCK';

COUNT(*)
----------
        76

[oracle@SOURCE ~]$ cat parse.sql
SELECT B.VALUE  FROM V$STATNAME A, V$MYSTAT B WHERE A.STATISTIC# = B.STATISTIC#
AND A.NAME IN ('parse count (hard)');

SQL> SELECT SUM(HEADER_BLOCK) FROM T1 WHERE SEGMENT_TYPE = 'INDEX' AND HEADER_BLOCK > 100;

SUM(HEADER_BLOCK)
-----------------
         59390560

SQL> @parse.sql

VALUE
----------
         1

SQL> @parse.sql

VALUE
----------
         1

SQL> SELECT SUM(HEADER_BLOCK) FROM T1 WHERE SEGMENT_TYPE = 'INDEX' AND HEADER_BLOCK > 101;

SUM(HEADER_BLOCK)
-----------------
         59390560

SQL> @parse.sql

VALUE
----------
         2

SQL> SELECT SUM(HEADER_BLOCK) FROM T1 WHERE SEGMENT_TYPE = 'INDEX' AND HEADER_BLOCK > 103;

SUM(HEADER_BLOCK)
-----------------
         59390560

SQL> @parse.sql

VALUE
----------
         3

上面修改HEADER_BLOCK的值,进行了硬解析,下面测试修改等条件的值

SQL> SELECT SUM(HEADER_BLOCK) FROM T1 WHERE HEADER_BLOCK > 103 and SEGMENT_TYPE = 'INDEX';

SUM(HEADER_BLOCK)
-----------------
         59390560

SQL> @parse.sql

VALUE
----------
         1

SQL> SELECT SUM(HEADER_BLOCK) FROM T1 WHERE HEADER_BLOCK > 103 and SEGMENT_TYPE = 'TABLE';

SUM(HEADER_BLOCK)
-----------------
         33745222

SQL> @parse.sql

VALUE
----------
         1
        
没有进行硬解析

SQL> DECLARE
  2     LN_COU   NUMBER;
  3     LN_VALUE NUMBER;
  4     LVC_SQL  VARCHAR2(200);
  5  BEGIN
  6     FOR I IN 1 .. 100 LOOP
  7             LVC_SQL := 'SELECT /*+FLAG1*/SUM(HEADER_BLOCK) FROM T1 WHERE SEGMENT_TYPE = ''INDEX'' AND HEADER_BLOCK > ' ||
  8                                                      TO_NUMBER(1000 + I);
  9             EXECUTE IMMEDIATE LVC_SQL
 10                     INTO LN_COU;
 11     END LOOP;
 12  END;
 13  /
 
SQL> SELECT SHARABLE_MEM, VERSION_COUNT, LOADS, INVALIDATIONS
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG1%'
  4      AND SQL_TEXT NOT LIKE 'DECLARE%';

SHARABLE_MEM VERSION_COUNT      LOADS INVALIDATIONS
------------ ------------- ---------- -------------
     1156725           100        100             0

SQL> DECLARE
  2     LN_COU   NUMBER;
  3     LN_VALUE NUMBER;
  4     LVC_SQL  VARCHAR2(200);
  5  BEGIN
  6     FOR I IN 1 .. 10000 LOOP
  7             LVC_SQL := 'SELECT /*+FLAG1*/SUM(HEADER_BLOCK) FROM T1 WHERE SEGMENT_TYPE = ''INDEX'' AND HEADER_BLOCK > ' ||
  8                                                      TO_NUMBER(1000 + I);
  9             EXECUTE IMMEDIATE LVC_SQL
 10                     INTO LN_COU;
 11     END LOOP;
 12  END;
 13  /

PL/SQL procedure successfully completed.

SQL> SELECT SHARABLE_MEM, VERSION_COUNT, LOADS, INVALIDATIONS
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG1%'
  4      AND SQL_TEXT NOT LIKE 'DECLARE%';

SHARABLE_MEM VERSION_COUNT      LOADS INVALIDATIONS
------------ ------------- ---------- -------------
    15035505          1496       1301             0

version_count在运行的时候是一直变化的,最高到达过2000多,然后又下降

在操作系统上做了个脚本,挂载后台同时10个一起跑,10分钟报04031

cursor_charing <> exact 时候,如果SQL中有不等条件,sessin_cursor_cache无作用

先来看下Session_Cached_Cursors关闭的情况

ALTER SESSION SET Session_Cached_Cursors=0;

BEGIN  
   FOR i IN 1..100 LOOP
    EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
    END LOOP;
END;

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        100        100 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1

语句解析了100次

SQL> ALTER SESSION SET Session_Cached_Cursors=1;

Session altered.

SQL> BEGIN  
  2     FOR i IN 1..100 LOOP
  3      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
  4      END LOOP;
  5  END;
  6  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        101        200 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1

设置了Session_Cached_Cursors=1后,语句只增加了1次解析

SQL> BEGIN  
  2     FOR i IN 1..100 LOOP
  3      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
  4      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where header_block>1000';
  5      END LOOP;
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6    
SQL> /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        201        300 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1
        100        100 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block>:"SYS_B_0"

如果增加了1个语句,由于只能使用1个Session_Cached_Cursors,所以又增加了100次

SQL>  ALTER SESSION SET Session_Cached_Cursors=2;

Session altered.

SQL> BEGIN  
  2     FOR i IN 1..100 LOOP
  3      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
  4      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where header_block>1000';
  5      END LOOP;
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        202        400 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1
        200        200 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block>:"SYS_B_0"

第二个SQL不能使用Session_Cached_Cursors

SQL> BEGIN  
  2     FOR i IN 1..100 LOOP
  3      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
  4      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where header_block>1000';
  5      END LOOP;
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text   
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        203        500 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1
        300        300 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block>:"SYS_B_0"

尝试改为FORCE

SQL> ALTER SESSION SET CURSOR_SHARING=FORCE;

Session altered.

SQL> BEGIN  
  2     FOR i IN 1..100 LOOP
  3      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
  4      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where header_block>1000';
  5      END LOOP;
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        204        600 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1
        400        400 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block>:"SYS_B_0"

设置成FORCE依然不行,那实验下为exact

SQL> ALTER SESSION SET CURSOR_SHARING=exact;

Session altered.

SQL> BEGIN  
  2     FOR i IN 1..100 LOOP
  3      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1';
  4      EXECUTE IMMEDIATE 'SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where header_block>1000';
  5      END LOOP;
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG7%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
        205        700 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1
        400        400 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block>:"SYS_B_0"

1        100 SELECT /*+FLAG7*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block>1000

SQL> DECLARE
  2    ln_num NUMBER := 100;  
  3  BEGIN  
  4     FOR i IN 1..100 LOOP
  5      EXECUTE IMMEDIATE 'SELECT /*+FLAG8*/SUM(HEADER_BLOCK) FROM T1';
  6      EXECUTE IMMEDIATE 'SELECT /*+FLAG8*/SUM(HEADER_BLOCK) FROM T1 where header_block> :b' USING ln_num;
  7      END LOOP;
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> SELECT parse_calls,executions,sql_text
  2     FROM V$SQLAREA
  3   WHERE SQL_TEXT LIKE '%FLAG8%'
  4      AND SQL_TEXT NOT LIKE '%sqlarea%'
  5     AND sql_text NOT LIKE '%BEGIN%'
  6  /

PARSE_CALLS EXECUTIONS SQL_TEXT
----------- ---------- --------------------------------------------------
          1        100 SELECT /*+FLAG8*/SUM(HEADER_BLOCK) FROM T1 where h
                       eader_block> :b

1        100 SELECT /*+FLAG8*/SUM(HEADER_BLOCK) FROM T1

必须要使用绑定变量才能很好的使用sessin_cursor_cache

cursor_charing <> exact 时候,OUTLINE,STA不起作用

这个以前测试过,就不做测试了。不起作用的原因为,优化器根据没有进行自动绑定变量的SQL去找OUTLINE,STA中的执行计划,而OUTLINE,STA中保存的执行计划为进行绑定后的语句

总结一下如何使用这个后面 cusor_sharing

  1. 如果要使用similar,不要收集直方图,但是没直方图,感觉还不如用force
  2. similar很耗内存,对于我们的一个省级中的应用,单实例,SQL AREA基本需要2G以上,RAC的话,每个实例几乎都需要2G以上
  3. sessin_cursor_cache几乎没作用,可以不做设置。
  4. 调用工具OUTLINE,STA就别想用,唉,唯一的办法只有该SQL,其他和执行计划有关的参数最好别调整,副作用太大
  5. 再次看出绑定变量的重要性!!!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8242091/viewspace-584883/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8242091/viewspace-584883/

走ORACLE后门cusor_sharing的问题相关推荐

  1. 京东走微信“后门”是福是祸?

    据说,腾讯在入股京东之后终于有了实质性的动作,微信承诺给京东的一级入口在"发现"之下,和"朋友圈"并列.此前已接入移动端的C2C拍拍微店,将从订阅号升级为不折叠 ...

  2. 洪兴社的Oracle情节之安全管理篇(一)

    一数据库版本 SYS@LEO1>select * from v$version; BANNER ------------------------------------------------- ...

  3. mysql date 默认值_通过Oracle DB了解MySQL

    Oracle数据库是业界的翘楚,各行各业拥有大量的Oracle DB的DBA,本文尝试通过将Oracle与MySQL数据库的架构.安全.模式对象.数据类型及数据存储进行对比,以方便熟悉Oracle数据 ...

  4. 陆金所服务器维护,陆金所如何在线更换金融核心场景的 Oracle 数据库

    陆金所从 2018 年启动全站去 O 项目以来,在不做任何服务降级的情况下,历时 2 年通过上百次变更,把全站 98% 的 Oracle 数据库无缝切换到 MySQL 上.其中,这 98% 的数据库覆 ...

  5. 好莱坞走到新时代的门口 六大高层动荡背后的真相

    Lila 文 一年内,除迪士尼以外的好莱坞其他五大电影公司都经历了或即将经历人事震荡.如今好莱坞格局有怎样的改变?新媒体和高科技将对影视产业造成怎样的冲击?这些是否意味着好莱坞一个时代的结束? 继20 ...

  6. mysql删除root用户密码_MySQL忘记密码 或者误删除root用户有效解决办法

    我们在使用MySQL的时候,有时候会忘记用户的密码 尤其是root用户的密码,这时候就需要走一下后门改一下密码了,思路和linux改root用户密码差不多 都是先绕过权限认证阶段 然后用一条updat ...

  7. 五年五件事,助我踏上寻梦路-追梦五年

    时光荏苒,五年的青春像流水般逝去.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...

  8. 专科生,还有未来吗?

    读者问: 你好,我加入这个星球也算比较久了在此之前也一直都是在观望,我是一个19年因为高考失利而没有选择复读的专科生,我选择的专业是嵌入式技术与应用,最近不知道为什么特别迷茫,在选择读专科之前我没有想 ...

  9. 国产编程语言又造假,丢不起这人!

    前几天中科院宣布隶属其下的某实验室「计算机体系结构国家重点实验室编译组」成功研发了一门国产编程语言,名叫木兰. 研发团队成员表示:编程语言在技术产业中有非常重要的价值,依赖开源等形式的外部技术,存在较 ...

最新文章

  1. Java中Thread中的实例方法_Java多线程2:Thread中的实例方法
  2. 转载:PHP JSON_ENCODE 不编码中文汉字的方法
  3. Android移动开发之【Android实战项目】Textview各项属性(全)
  4. linux yum源安装
  5. php lalaogu cn,php安装编译时错误合集
  6. could not create connection to database server.] with root cause
  7. IBM致梁允超:乘着新技术东风 SaaS100+让汤臣“倍”加健壮
  8. 值类型和引用类型---深究
  9. SpringCloud Ribbon实战以及Ribbon的源码浅析(四)
  10. access统计班级人数_7省新高考选科统计出炉!学科难度系数排行再度爆冷
  11. java获取访问路径、域名、项目名、请求入参
  12. 敏捷开发框架_RingCentral Tech丨LeSS- 大规模敏捷开发框架实践心路
  13. php class variable,PHP中的變量類擴展 - 是否可能?
  14. Stereo Matching文献笔记之(九):经典算法Semi-Global Matching(SGM)之神奇的HMI代价计算~
  15. python平行四边形代码_python 已知平行四边形三个点,求第四个点的案例
  16. matlab gui修改图标,Matlab的GUI中左上角修改为自己想要的图标
  17. c语言控制台数字键打地鼠,C语言编程打地鼠
  18. uniapp推出小程序SDK,会是一场技术驱动的行业变革吗?
  19. 传输线理论(一)传输线参量
  20. 下载 macOS 系统安装程序的方法

热门文章

  1. Android专利战对大陆手机产业的影响
  2. 第3章-2 查验身份证
  3. CAD制图神器-CAD专用键盘
  4. 一个男朋友写给女朋友的信!爆笑(真勇敢)
  5. PyCharm vs VSCode 到底谁更牛?
  6. 用matlab绘制分段函数曲线
  7. 大学生竞赛管理系统-JAVA【数据库设计、源码、开题报告】
  8. Shortcuts快速入门
  9. 缓存插件 EHCache
  10. 红米4a android 9 速度,小米-红米4A/5A-通刷-LOS-Beta5.0-安卓9.0.0-来去电归属-农历等-本地化增强适配...