[20130313]cursor_sharing=force的问题.txt

简介: [20130313]cursor_sharing=force的问题.txt 前一阵子,我把生产系统的cursor_sharing设置为force, 大概按照链接: http://space.
[20130313]cursor_sharing=force的问题.txt

前一阵子,我把生产系统的cursor_sharing设置为force,

大概按照链接:
http://space.itpub.net/267265/viewspace-754003

我发现一个奇怪的问题,自己在测试环境重复测试看看.


1.建立测试环境:
SQL> select * from v$version where rownum

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

SQL> create table t as select rownum id,'test' name from dual connect by level
Table created.

SQL> select * from t where id=10;

        ID NAME
---------- -----
        10 test

SQL> @dpc '' ''

PLAN_TABLE_OUTPUT
--------------------------------------------------------
SQL_ID  6wxj4tkdajgbx, child number 0
-------------------------------------
select * from t where id=10

Plan hash value: 1601196873

--------------------------------------------------------
| Id  | Operation         | Name | E-Rows | Cost (%CPU)|
--------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |     3 (100)|
|*  1 |  TABLE ACCESS FULL| T    |      1 |     3   (0)|
--------------------------------------------------------
--sql_id=6wxj4tkdajgbx.

SQL> select sql_text,EXECUTIONS from v$sql where sql_id='6wxj4tkdajgbx';

SQL_TEXT                                                 EXECUTIONS
-------------------------------------------------------- ----------
select * from t where id=10                                       1

2.现在修改回话参数cursor_sharing=force.
SQL> alter session set cursor_sharing=force;
Session altered.

SQL> select * from t where id=10;

        ID NAME
---------- -----
        10 test

SQL> select sql_text,EXECUTIONS,CHILD_NUMBER from v$sql where sql_id='6wxj4tkdajgbx';

SQL_TEXT                                                 EXECUTIONS CHILD_NUMBER
-------------------------------------------------------- ---------- ------------
select * from t where id=10                                       2            0

--可以发现执行测试变成了2次.难道在使用cursor_sharing=force,sql语句不是变成
--select * from t where id= ":SYS_B_0";吗?
--退出sqlplus,设置参数alter session set cursor_sharing=force;问题依旧!

--换一个参数看看,发现可以使用的.

SQL> select * from t where id=11;

        ID NAME
---------- -----
        11 test

SQL> @dpc '' ''

PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  1ab9rw9y1r9yt, child number 0
-------------------------------------
select * from t where id=:"SYS_B_0"

Plan hash value: 1601196873

--------------------------------------------------------
| Id  | Operation         | Name | E-Rows | Cost (%CPU)|
--------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |     3 (100)|
|*  1 |  TABLE ACCESS FULL| T    |      1 |     3   (0)|
--------------------------------------------------------

Peeked Binds (identified by position):
--------------------------------------

   1 - :SYS_B_0 (NUMBER): 11

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("ID"=:SYS_B_0)

3.清空共享池看看.
SQL> alter system flush shared_pool;
System altered.

SQL> select sql_text,EXECUTIONS,CHILD_NUMBER from v$sql where sql_id='6wxj4tkdajgbx';
no rows selected

SQL> show parameter cursor

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------
cursor_sharing                       string      FORCE
cursor_space_for_time                boolean     FALSE
open_cursors                         integer     300
session_cached_cursors               integer     50
SQL> select * from t where id=10;

        ID NAME
---------- -----
        10 test

SQL> @dpc '' ''

PLAN_TABLE_OUTPUT
---------------------------------------------------------
SQL_ID  6wxj4tkdajgbx, child number 0
-------------------------------------
select * from t where id=10
Plan hash value: 1601196873
--------------------------------------------------------
| Id  | Operation         | Name | E-Rows | Cost (%CPU)|
--------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |     3 (100)|
|*  1 |  TABLE ACCESS FULL| T    |      1 |     3   (0)|
--------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("ID"=10)

SQL> select sql_text,EXECUTIONS,CHILD_NUMBER from v$sql where sql_id='6wxj4tkdajgbx';

SQL_TEXT                                                 EXECUTIONS CHILD_NUMBER
-------------------------------------------------------- ---------- ------------
select * from t where id=10                                       1            0

--可以发现依旧不转化为select * from t where id=:"SYS_B_0"方式执行.为什么呢?
--难道一些东西依旧记忆在某些地方.

SQL> column KGLNAOBJ format a30
SQL> SELECT addr, kglnaobj, indx  FROM x$kglob WHERE kglobt03 = '6wxj4tkdajgbx';

ADDR             KGLNAOBJ                             INDX
---------------- ------------------------------ ----------
0000002A972E5298 select * from t where id=10             0
0000002A972FD698 select * from t where id=10             1

SQL> alter system flush shared_pool;
System altered.

SQL> SELECT addr, kglnaobj, indx  FROM x$kglob WHERE kglobt03 = '6wxj4tkdajgbx';
no rows selected

--奇怪!无论是分析以及加注解,以及授权都无法改变这种情况.

SQL> exec dbms_stats.gather_table_stats(USER,'T',METHOD_OPT => 'FOR ALL COLUMNS SIZE 1 ',No_Invalidate => FALSE);
PL/SQL procedure successfully completed.

SQL> COMMENT ON TABLE T IS '';

3.建立索引看看:
SQL> create index i_t on t(id);
Index created.

SQL> select * from t where id=10;

        ID NAME
---------- -----
        10 test

SQL> @dpc '' ''

PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  6wxj4tkdajgbx, child number 0
-------------------------------------
select * from t where id=10
Plan hash value: 2928007915
------------------------------------------------------------------
| Id  | Operation                   | Name | E-Rows | Cost (%CPU)|
------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |        |     2 (100)|
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |      1 |     2   (0)|
|*  2 |   INDEX RANGE SCAN          | I_T  |      1 |     1   (0)|
------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("ID"=10)

--执行计划发生了变化,但是依旧没有转化为select * from t where id=:"SYS_B_0"方式.
--这样即使我修改了cursor_sharing=force,原来执行的sql语句依旧不转化,如果我重启数
--据库,这个现象才消失.如果解决,什么原因呢?



目录
相关文章
PADS原理图分页设计
当我们遇到原理图内容比较多,一个图页放不下时,我们就需要将原理图拆分成多个图页设计。比如分成MCU、POWER、CONNECT三个图页,如下图所示:
651 0
|
10月前
|
算法 前端开发 API
开源轻量级IM框架MobileIMSDK的鸿蒙NEXT客户端库已发布
MobileIMSDK-鸿蒙端是一套基于鸿蒙Next(纯血鸿蒙)系统的IM即时通讯客户端库: 1)超轻量级(编译后库文件仅50KB)、无任何第3方库依赖(开箱即用); 2)纯ArkTS编写、无Native代码、高度提炼、简单易用; 3)基于鸿蒙Next标准WebSocket API,简洁优雅; 4)可运行于任何支持鸿蒙Next的平台; 5)能与 MobileIMSDK的各种客户端完美互通; 6)可应用于鸿蒙Next中的消息推送、客服聊天、企业OA、IM等场景。
319 45
|
12月前
|
JSON 前端开发 Java
Spring MVC详解(上)
本文介绍了MVC架构及其在Spring MVC框架中的应用。MVC将应用程序分为模型、视图和控制器三部分,分别负责数据处理、用户界面展示和请求处理。Spring MVC作为MVC模式的具体实现,不仅是一个web框架,还提供了强大的功能支持,如URL路由映射、参数传递、JSON数据处理、文件上传等。文章详细讲解了如何在Spring MVC中使用`@RequestMapping`、`@RequestParam`、`@RequestBody`、`@PathVariable`等注解来处理HTTP请求,并展示了具体的代码示例和操作步骤。
140 1
|
12月前
table表格基础知识及简单运用
table表格基础知识及简单运用
270 0
|
SQL 大数据 调度
大数据线上问题排查系列 - HIVE 踩坑记- hive.metastore.dml.events
大数据线上问题排查系列 - HIVE 踩坑记- hive.metastore.dml.events
|
SQL 缓存 JavaScript
从120s到2.5s!看看人家的MyBatis批量插入数据优化,那叫一个优雅! 下
从120s到2.5s!看看人家的MyBatis批量插入数据优化,那叫一个优雅! 下
|
存储 边缘计算 人工智能
|
前端开发 算法 JavaScript
程序员必备的技术网站合集
程序员必备的网站PROGRAMMER NECESSARY一提到程序员的话,大部分人想到的都是高薪的代名词,然而在这背后需要大量不间断的学习来支撑,我们需要时刻保持自己...
570 0
|
存储 编译器 程序员
【C语言】数组
【C语言】数组
【C语言】数组
|
存储 数据库 Docker
Docker跨宿主机通讯macvlan、overlay详解(十一)
2.docker跨宿主机通讯 2.1.macvlan 创建网络语法格式 docker network create --driver 网络类型 --subnet 网段 --gateway 网关 -o parent=通讯网卡 网络名 参数 docker network 创建网络的关键字,必须有 create 创建一个网络 ls 列出创建的所有网络 rm 删除一个网络 connect 连接一个网络 –dirver 指定要创建的网络类型 –subnet 指定网段 – gateway 指定网关 -o parent 在哪块网卡上虚拟出多个网卡
1008 0
Docker跨宿主机通讯macvlan、overlay详解(十一)