走ORACLE后门cusor_sharing的问题
当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
- 如果要使用similar,不要收集直方图,但是没直方图,感觉还不如用force
- similar很耗内存,对于我们的一个省级中的应用,单实例,SQL AREA基本需要2G以上,RAC的话,每个实例几乎都需要2G以上
- sessin_cursor_cache几乎没作用,可以不做设置。
- 调用工具OUTLINE,STA就别想用,唉,唯一的办法只有该SQL,其他和执行计划有关的参数最好别调整,副作用太大
- 再次看出绑定变量的重要性!!!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8242091/viewspace-584883/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8242091/viewspace-584883/
走ORACLE后门cusor_sharing的问题相关推荐
- 京东走微信“后门”是福是祸?
据说,腾讯在入股京东之后终于有了实质性的动作,微信承诺给京东的一级入口在"发现"之下,和"朋友圈"并列.此前已接入移动端的C2C拍拍微店,将从订阅号升级为不折叠 ...
- 洪兴社的Oracle情节之安全管理篇(一)
一数据库版本 SYS@LEO1>select * from v$version; BANNER ------------------------------------------------- ...
- mysql date 默认值_通过Oracle DB了解MySQL
Oracle数据库是业界的翘楚,各行各业拥有大量的Oracle DB的DBA,本文尝试通过将Oracle与MySQL数据库的架构.安全.模式对象.数据类型及数据存储进行对比,以方便熟悉Oracle数据 ...
- 陆金所服务器维护,陆金所如何在线更换金融核心场景的 Oracle 数据库
陆金所从 2018 年启动全站去 O 项目以来,在不做任何服务降级的情况下,历时 2 年通过上百次变更,把全站 98% 的 Oracle 数据库无缝切换到 MySQL 上.其中,这 98% 的数据库覆 ...
- 好莱坞走到新时代的门口 六大高层动荡背后的真相
Lila 文 一年内,除迪士尼以外的好莱坞其他五大电影公司都经历了或即将经历人事震荡.如今好莱坞格局有怎样的改变?新媒体和高科技将对影视产业造成怎样的冲击?这些是否意味着好莱坞一个时代的结束? 继20 ...
- mysql删除root用户密码_MySQL忘记密码 或者误删除root用户有效解决办法
我们在使用MySQL的时候,有时候会忘记用户的密码 尤其是root用户的密码,这时候就需要走一下后门改一下密码了,思路和linux改root用户密码差不多 都是先绕过权限认证阶段 然后用一条updat ...
- 五年五件事,助我踏上寻梦路-追梦五年
时光荏苒,五年的青春像流水般逝去.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office&qu ...
- 专科生,还有未来吗?
读者问: 你好,我加入这个星球也算比较久了在此之前也一直都是在观望,我是一个19年因为高考失利而没有选择复读的专科生,我选择的专业是嵌入式技术与应用,最近不知道为什么特别迷茫,在选择读专科之前我没有想 ...
- 国产编程语言又造假,丢不起这人!
前几天中科院宣布隶属其下的某实验室「计算机体系结构国家重点实验室编译组」成功研发了一门国产编程语言,名叫木兰. 研发团队成员表示:编程语言在技术产业中有非常重要的价值,依赖开源等形式的外部技术,存在较 ...
最新文章
- Java中Thread中的实例方法_Java多线程2:Thread中的实例方法
- 转载:PHP JSON_ENCODE 不编码中文汉字的方法
- Android移动开发之【Android实战项目】Textview各项属性(全)
- linux yum源安装
- php lalaogu cn,php安装编译时错误合集
- could not create connection to database server.] with root cause
- IBM致梁允超:乘着新技术东风 SaaS100+让汤臣“倍”加健壮
- 值类型和引用类型---深究
- SpringCloud Ribbon实战以及Ribbon的源码浅析(四)
- access统计班级人数_7省新高考选科统计出炉!学科难度系数排行再度爆冷
- java获取访问路径、域名、项目名、请求入参
- 敏捷开发框架_RingCentral Tech丨LeSS- 大规模敏捷开发框架实践心路
- php class variable,PHP中的變量類擴展 - 是否可能?
- Stereo Matching文献笔记之(九):经典算法Semi-Global Matching(SGM)之神奇的HMI代价计算~
- python平行四边形代码_python 已知平行四边形三个点,求第四个点的案例
- matlab gui修改图标,Matlab的GUI中左上角修改为自己想要的图标
- c语言控制台数字键打地鼠,C语言编程打地鼠
- uniapp推出小程序SDK,会是一场技术驱动的行业变革吗?
- 传输线理论(一)传输线参量
- 下载 macOS 系统安装程序的方法