设为首页 收藏本站
查看: 516|回复: 0

[经验分享] Oracle 10g获取bind peek值

[复制链接]

尚未签到

发表于 2016-7-29 10:58:18 | 显示全部楼层 |阅读模式
在分析SQL执行效率时,在存在柱状图的情况下,绑定变量窥视(bind peeking)是不容忽视的因素,但往往缺乏必要的技术获知绑定变量具体值,从而无法为分析提供直接的证据,
所幸的是在Oracle 10g,Oracle提供了2种途径获取绑定变量具体值。
首先创建具有倾斜字段的表格,在其上创建索引,并进行表分析,以保证能进行绑定变量窥视
SQL> create table test1 as select * from dba_objects;

Table created.

SQL> select status,count(*) from test1 group by status;

STATUS    COUNT(*)
------- ----------
INVALID          9
VALID        51074

SQL> show parameter cursor_sharing

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing                       string      EXACT

SQL> create index testidx on test1(status);

Index created.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS (ownname=>user,tabname=>'TEST1',estimate_percent=>100,method_opt=>'FOR COLUMNS STATUS SIZE 2');

PL/SQL procedure successfully completed.
为保证测试干净环境,刷出shared pool内存

SQL> alter system flush shared_pool;

System altered.

(一)倾斜字段为INVALID时
SQL>  exec :v1 :='INVALID';

PL/SQL procedure successfully completed.

SQL> select count(*) from test1 where status=:v1;

  COUNT(*)
----------
         9
(1)采用dbms_xplan.display_cursor获取绑定变量
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ADVANCED'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  7vnz1tjwm8zpv, child number 0
-------------------------------------
select count(*) from test1 where status=:v1

Plan hash value: 121734241

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |         |     1 |     7 |            |          |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   INDEX RANGE SCAN| TESTIDX |     9 |    63 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   2 - SEL$1 / TEST1@SEL$1

Outline Data
-------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "TEST1"@"SEL$1" ("TEST1"."STATUS"))
      END_OUTLINE_DATA
  */


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

   1 - :V1 (VARCHAR2(30), CSID=852): 'INVALID'

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

   2 - access("STATUS"=:V1)

Column Projection Information (identified by operation id):

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------

   1 - (#keys=0) COUNT(*)[22]


48 rows selected.
(2)采用dbms_sqltune.extract_binds获取绑定变量
SQL> select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE sql_id='7vnz1tjwm8zpv';

BIND(NAME, POSITION, DUP_POSITION, DATATYPE, DATATYPE_STRING, CHARACTER_SID, PRE
--------------------------------------------------------------------------------
SQL_BIND_SET(SQL_BIND(NULL, 1, NULL, 1, 'VARCHAR2(2000)', 852, NULL, NULL, 2000,
'28-MAR-11', 'INVALID', ANYDATA()))

二、倾斜字段为VALID时,绑定变量窥视发生作用,可以看到依然为INVALID
SQL> exec :v1 :='VALID'

PL/SQL procedure successfully completed.

SQL> select count(*) from test1 where status=:v1;

  COUNT(*)
----------
     51074

SQL> select * from table(dbms_xplan.display_cursor(null,null,'ADVANCED'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  7vnz1tjwm8zpv, child number 0
-------------------------------------
select count(*) from test1 where status=:v1

Plan hash value: 121734241

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |         |     1 |     7 |            |          |

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   INDEX RANGE SCAN| TESTIDX |     9 |    63 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   2 - SEL$1 / TEST1@SEL$1

Outline Data
-------------

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------

  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('10.2.0.3')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "TEST1"@"SEL$1" ("TEST1"."STATUS"))
      END_OUTLINE_DATA
  */


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

   1 - :V1 (VARCHAR2(30), CSID=852): 'INVALID'

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

   2 - access("STATUS"=:V1)

Column Projection Information (identified by operation id):

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------

   1 - (#keys=0) COUNT(*)[22]


48 rows selected.

SQL> select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE sql_id='7vnz1tjwm8zpv';

BIND(NAME, POSITION, DUP_POSITION, DATATYPE, DATATYPE_STRING, CHARACTER_SID, PRE
--------------------------------------------------------------------------------
SQL_BIND_SET(SQL_BIND(NULL, 1, NULL, 1, 'VARCHAR2(2000)', 852, NULL, NULL, 2000,
'28-MAR-11', 'INVALID', ANYDATA()))

附:如果要确切知道绑定变量窥视具体发生时间,可以将nls_date_format置为'yyyy-mm-dd hh24:mi:ss'格式
dbms_sqltune.extract_binds(bind_data).在bind_data的类型定义中
  name                VARCHAR2(30),                     /* bind variable name */
  position            NUMBER,            /* position of bind in sql statement */
  dup_position        NUMBER,    /* if any, position of primary bind variable */
  datatype            NUMBER,                    /* datatype id for this bind */
  datatype_string     VARCHAR2(15),/* string representation of above datatype */
  character_sid       NUMBER,              /* character set id if bind is NLS */
  precision           NUMBER,                               /* bind precision */
  scale               NUMBER,                                   /* bind scale */
  max_length          NUMBER,                          /* maximum bind length */
  last_captured       DATE,      /* DATE when this bind variable was captured */
  value_string        VARCHAR2(4000),     /* bind value (text representation) */
  value_anydata       ANYDATA)         /* bind value (anydata representation) */

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> select dbms_sqltune.extract_binds(bind_data) bind from v$sql WHERE sql_id='7vnz1tjwm8zpv';

BIND(NAME, POSITION, DUP_POSITION, DATATYPE, DATATYPE_STRING, CHARACTER_SID, PRE
--------------------------------------------------------------------------------
SQL_BIND_SET(SQL_BIND(NULL, 1, NULL, 1, 'VARCHAR2(2000)', 852, NULL, NULL, 2000,
'2011-03-28 14:51:09', 'INVALID', ANYDATA()))

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251119-1-1.html 上篇帖子: 创建索引ORACLE 需要做的工作 下篇帖子: oracle动态创建table关键字过滤
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表