[20170724]提示BIND_AWARE与PLSQL光标缓存

[20170724]提示BIND_AWARE与PLSQL光标缓存.txt

--//[20170724]Bind Sensitivity and PLSQL cursor caching.txt
--//曾经写过一个系列acs的文章.链接如下:
http://blog.itpub.net/267265/viewspace-721817/
http://blog.itpub.net/267265/viewspace-1336242/
http://blog.itpub.net/267265/viewspace-1336353/
http://blog.itpub.net/267265/viewspace-1368531/
http://blog.itpub.net/267265/viewspace-1369051/
http://blog.itpub.net/267265/viewspace-1483316/

--//我曾经提到这个功能可能就是鸡肋,因为有太多不可控因素,而使用提示bind_aware倒是一个不错的建议.
--//当然最佳的模式也是对于这种情况不使用绑定变量,而是直接带入文字值.

--//另外我在http://blog.itpub.net/267265/viewspace-1368531/测试中提到.PL/sql里面执行存在问题,实际上
--//这个是bug,我当时的版本是11.2.0.3. 估计11.2.0.4已经解决这个问题.

--//我曾在别人讲解绑定变量时提到,如果有什么提示要讲给开发的化,就是bind_aware提示.
--//因为我认为acs存在太多不确定因素.但是在PL/SQL中使用bind_aware提示会出现什么情况呢?
--//通过测试说明问题:

1.环境:

SCOTT@test01p> @ ver1
PORT_STRING          VERSION    BANNER                                                                       CON_ID
-------------------- ---------- ---------------------------------------------------------------------------- ------
IBMPC/WIN_NT64-9.1.0 12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production      0

2.建立测试例子:

create table t nologging as
   select rownum id, 
        case mod(rownum,  10000) when 0 then 0 else 1 end flag,
        rpad('X', 100, 'X') padding
        from dual
        connect by level <= 2e5;
--//说明:这样字段flag存在不均衡,0很少(仅仅20个),而1很多,也就是在这个字段建立索引,查询=0时选择索引最佳,而查询=1,走全部扫描
--//最佳.

SCOTT@test01p> select count(*),flag from t group by flag;

  COUNT(*)       FLAG
---------- ----------
    199980          1
        20          0

SCOTT@test01p> create index i_t_flag on t(flag);
Index created.

SCOTT@test01p> exec dbms_stats.gather_table_stats(NULL, 'T', METHOD_OPT=>'FOR ALL COLUMNS SIZE SKEWONLY');
PL/SQL procedure successfully completed.

SCOTT@test01p> @ tab_lh scott t flag

DISPLAY TABLE_NAME OF COLUMN_NAME INFORMATION.
INPUT   OWNER TABLE_NAME COLUMN
SAMPLE  : @ TAB_LH TABLE_NAME [COLUMN_NAME]
IF NOT INPUT COLUMN_NAME ,USE "" .

COLUMN_NAME  DATA_TYPE DATA_LENGTH N NUM_DISTINCT    DENSITY SAMPLE_SIZE TRANS_LOW TRANS_HIGH  NUM_NULLS NUM_BUCKETS LAST_ANALYZED       HISTOGRAM DATA_DEFAULT
------------ --------- ----------- - ------------ ---------- ----------- --------- ---------- ---------- ----------- ------------------- --------- ------------
FLAG         NUMBER             22 Y            2   .0000025      200000 0         1                   0           2 2017-07-23 20:20:57 FREQUENCY 
--//建立直方图在flag字段.

create or replace procedure get_flag_count(p in number)
is
   dummy number;
begin
   select /*+ bind_aware sktest */ count(*) INTO dummy FROM t where flag = p;
end;
/

declare
   dummy number;
begin
   get_flag_count(0);
   get_flag_count(1);
end;  
/

--//确定sql_id='51wyyw23rhbc4'.

SCOTT@test01p> @ dpc 51wyyw23rhbc4 ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  51wyyw23rhbc4, child number 0
-------------------------------------
SELECT /*+ bind_aware sktest */ COUNT(*) FROM T WHERE FLAG = :B1
Plan hash value: 3837301025
-------------------------------------------------------------------------------
| Id  | Operation         | Name     | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |        |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |          |      1 |     3 |            |          |
|*  2 |   INDEX RANGE SCAN| I_T_FLAG |     20 |    60 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1
   2 - SEL$1 / T@SEL$1
Peeked Binds (identified by position):
--------------------------------------
   1 - :1 (NUMBER): 0
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("FLAG"=:B1)

SCOTT@test01p> select sql_text,child_number, executions, parse_calls, is_bind_sensitive, is_bind_aware  from v$sql where sql_id = '51wyyw23rhbc4';
SQL_TEXT                                                     CHILD_NUMBER EXECUTIONS PARSE_CALLS I I
------------------------------------------------------------ ------------ ---------- ----------- - -
SELECT /*+ bind_aware sktest */ COUNT(*) FROM T WHERE FLAG =            0          2           1 Y Y
:B1

--//你可以发现提示bind_aware sktest失效!!
--//估计PL/SQL 光标缓存的原因,测试设置session_cached_cursors=0看看.

SCOTT@test01p> alter system flush shared_pool;
System altered.

SCOTT@test01p> select sql_text,child_number, executions, parse_calls, is_bind_sensitive, is_bind_aware  from v$sql where sql_id = '51wyyw23rhbc4';
no rows selected

declare
   dummy number;
begin
   execute immediate 'ALTER SESSION SET session_cached_cursors = 0';
   get_flag_count(0);
   get_flag_count(1);  
--   execute immediate 'ALTER SESSION RESET session_cached_cursors';
end;  
/

SCOTT@test01p> select sql_text c70,child_number, executions, parse_calls, is_bind_sensitive, is_bind_aware  from v$sql where sql_id = '51wyyw23rhbc4';
C70                                                                    CHILD_NUMBER EXECUTIONS PARSE_CALLS I I
---------------------------------------------------------------------- ------------ ---------- ----------- - -
SELECT /*+ bind_aware sktest */ COUNT(*) FROM T WHERE FLAG = :B1                  0          1           2 Y Y
SELECT /*+ bind_aware sktest */ COUNT(*) FROM T WHERE FLAG = :B1                  1          1           0 Y Y

--//可以发现现在生成新的子光标.换一句化正是参数session_cached_cursors,导致PL/sql中执行的sql语句光标的缓存,而提示失效.
--//上班在11.2.0.4重复测试看看.也存在相同的问题,大家可以自行测试.

时间: 2024-10-12 23:39:17

[20170724]提示BIND_AWARE与PLSQL光标缓存的相关文章

PLSQL Developer软件使用大全

PLSQL Developer软件使用大全   第一章 PLSQL Developer特性 PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发.如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分.PL/SQL Developer侧重于易用性.代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势. PL/SQL Developer主要特性: PL/SQL编辑器,

光标指向当前空行(关于TreeList)

问题描述 问题描述:窗体有一Dev第三方控件Treelist,当点击"增加"按钮时,Treelist增加一个空行并且光标指向新加的空行上:在当前空行上编辑数据时当光标焦点离开当前行时,就会弹出一个对话框判断当前数据是否有不为空的值,问题是对话框可以弹出来判断不为空表格的值,可对话框提示完毕后,光标就指向了别的行上,怎样再把光标指向当前新添加的行上?? 解决方案 解决方案二:请高手指教自己顶一下解决方案三:记住树的主键,重新定位解决方案四:请您给出具体的代码,新手正在学习中,谢谢了

OS开发网络篇—数据缓存

iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存.    二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用

iOS开发网络篇—数据缓存

iOS开发网络篇-数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题 (1)用户流量的浪费 (2)程序响应速度不够快 解决上面的问题,一般考虑对数据进行缓存. 二.缓存 为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据. 缓存数据的过程 当服务器返回数据时,需要做以下步骤 (1)使用服务器

iOS系统缓存方面开发的相关基础_IOS

一.关于同一个URL的多次请求   有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造成以下问题   (1)用户流量的浪费   (2)程序响应速度不够快   解决上面的问题,一般考虑对数据进行缓存.    二.缓存   为了提高程序的响应速度,可以考虑使用缓存(内存缓存\硬盘缓存) 第一次请求数据时,内存缓存中没有数据,硬盘缓存中没有数据.   缓存数据的过程 当服务器返回数据时,需要做以下步骤   (1)使用

YII Framework框架教程之缓存用法详解_php实例

本文实例讲述了YII Framework框架缓存用法.分享给大家供大家参考,具体如下: 缓存的产生原因众所周知.于是YII作为一个高效,好用的框架,不能不支持缓存.所以YII对各种流行的缓存都提供了接口,你可以根据你的需要使用不同的缓存. 1.YII中的缓存介绍 YII中的缓存是通过组件方式定义的,具体在如下目录 /yii_dev/yii/framework/caching# tree . ├── CApcCache.php ├── CCache.php ├── CDbCache.php ├──

Windows 8操作系统如何清除应用商店缓存

1. 在开始界面的空白处点击鼠标[右键].    2. 选择右下角的[所有应用].    3. 在"应用"列表中,点击[命令提示符].    4. 此时即可打开"命令提示符"窗口.    5. 在该窗口中输入"wsreset",然后按[Enter]键.      6. 当出现"已清除应用商店的缓存.现在可以在应用商店中浏览应用"的提示即可.    7. 点击左上方的[←]图标,即可返回到"应用商店".   

jquery ajax缓存问题解决方法小结

解决方法: 1.给请求链接加随机数,如果用的是jQuery,直接设置: $.ajaxSetup({cache: false}); 2.把type改成post,并随便设置设置一个参数data: 'a=b'(一定要设置参数,否则仍然会被cache) 3.说说生成不一样的数,就用随机数 Math.random();或者或者时间戳 + new Date(); 例子  代码如下 复制代码 $.ajax({     type:"GET"     url:'test.html',     cache

安卓开发之使用Acache类对数据进行二级缓存(内存+文件)

Acache类下载地址:http://pan.baidu.com/s/1gfI0A9X 1.创建Acache实例 Acache acache; acache = Acache.get(this, "main"); 2.将数据保存起来(内存和文件) acache.put(key,value,time); 前两个无需赘述,键值对,最后一个time,传入int类型,单位为秒,代表缓存存在的时间,超出这个时间,就会清除掉缓存的数据. 3.获取缓存的数据 以一个例子来描述这个问题:  代码如下