游标共享之cursor_sharing=force

本文详细探讨了Oracle中强制游标共享的机制如何导致执行计划不精确的问题,通过实验展示了其在不同场景下的表现,并强调了参数设置的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        cursor sharing=force , oracle将2条类似的SQL的谓词用一个变量代替,同时将它们看做同一条SQL语句处理。这种方式很粗暴,极可能造成执行计划的不准确。
        适用场景:在无法将应用的代码修改为绑定变量情况下,oracle提供的一种解决方法。

        注意:游标共享特性有个不太好的名声,就是它不是很稳定,过去数年,大量与之相关的bug被发现和确认。

         参数还有两种选择:

         游标共享之cursor_sharing=similar
         游标共享之cursor_sharing=EXACT

        下面来做个试验:

SQL> Drop table t purge;
SQL> show parameter cursor_sharing;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
_optimizer_extended_cursor_sharing   string      UDO
cursor_sharing                       string      EXACT
SQL> create table t as select * from dba_objects;
SQL> alter session set cursor_sharing=force;
SQL> alter system flush shared_pool;
SQL> select /*+test_force*/count(1) from t where object_id=100;
  COUNT(1)
----------
         1
SQL> select /*+test_force*/count(1) from t where object_id=100;
  COUNT(1)
----------
         1
SQL> select /*+test_force*/count(1) from t where object_id=200;
  COUNT(1)
----------
         1

SQL> col sql_text format a80;

----谓词不同的情况下只解析一次
SQL> select sql_id,child_number,sql_text from v$sql where sql_text like '%/*+test_force*/%'
  2  and  sql_text not like '%sql_text%';
SQL_ID        CHILD_NUMBER SQL_TEXT
------------- ------------ --------------------------------------------------------------------------------
f3jksnvgk93w9            0 select /*+test_force*/count(:"SYS_B_0") from t where object_id=:"SYS_B_1"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值