ACS与PL/SQL的工作情况分析
本篇内容主要讲解“ACS与PL/SQL的工作情况分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ACS与PL/SQL的工作情况分析”吧!
ACS与PL/SQL我们来看下ACS在PL/SQL里的工作情况,结果可能会令你非常失望。
首先构造一个PL/SQL,里面使用到了我们在本章中创建的表T:
SQL>varsql_idvarchar2(255)
SQL>altersystemflushshared_pool;
Systemaltered.
SQL>declare
2xinteger;
3nnumber;
4begin
5foriin1..10loop
6ifi=1then
7x:=500000;
8else
9x:=1;
10endif;
11selectcount(object_id)intonfromtwhereid>x;
12endloop;
13end;
14/
PL/SQLproceduresuccessfullycompleted.
这段PL/SQL首先会执行‘selectcount(object_id)intonfromtwhereid>100000’1次,然后会执行‘selectcount(object_id)intonfromtwhereid>1’9次,执行完成后,我们来看看是否会使用到ACS。
SQL>select
2sql_id
3,child_number
4,executions
5,parse_calls
6,buffer_gets
7,is_bind_sensitive
8,is_bind_aware
9from
10v$sql
11where
12sql_id='gp03v5aw085v3';
SQL_IDCHILD_NUMBEREXECUTIONSPARSE_CALLSBUFFER_GETSISIS
---------------------------------------------------------------
gp03v5aw085v30101646875YN
非常可惜,这个SQL并没有产生多个子游标,虽然已经识别到这个SQL为绑定敏感is_bind_sensitive='Y',但是is_bind_aware='N'。
SQL>SELECThash_value,sql_id,child_number,bucket_id,COUNT
2FROMv$sql_cs_histogram
3WHEREsql_id='gp03v5aw085v3'
4ORDERBYsql_id,child_number;
HASH_VALUESQL_IDCHILD_NUMBERBUCKET_IDCOUNT
---------------------------------------------------------
3087275875gp03v5aw085v3001
3087275875gp03v5aw085v3029
3087275875gp03v5aw085v3010
虽然v$sql_cs_histogram已经监控到了处理行数的巨大改变,但是却没有生成新的游标。
SQL>select*fromtable(dbms_xplan.display_cursor(:sql_id,null,'+PEEKED_BINDS'));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
SQL_IDgp03v5aw085v3,childnumber0
-------------------------------------
SELECTCOUNT(OBJECT_ID)FROMTWHEREID>:B1
Planhashvalue:3694077449
-------------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
-------------------------------------------------------------------------------------
|0|SELECTSTATEMENT||||4(100)||
|1|SORTAGGREGATE||1|10|||
|2|TABLEACCESSBYINDEXROWID|T|1|10|4(0)|00:00:01|
|*3|INDEXRANGESCAN|I|1||3(0)|00:00:01|
-------------------------------------------------------------------------------------
PeekedBinds(identifiedbyposition):
--------------------------------------
1-:B1(NUMBER):5000000
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
3-access("ID">:B1)
执行计划一直沿用的是第一次产生的执行计划,根据PeekedBinds(identifiedbyposition):的值为5000000可以推断出来。我们尝试在SQL里增加bind_awarehint看看,这个hint的作用在本章的最佳实践小节中介绍,这里不再赘述。
SQL>declare
2xinteger;
3nnumber;
4begin
5foriin1..10loop
6ifi=1then
7x:=5000000;
8else
9x:=1;
10endif;
11select/*+bind_aware*/count(object_id)intonfromtwhereid>x;
12endloop;
13end;
14/
PL/SQLproceduresuccessfullycompleted.
SQL>select
2sql_id
3,child_number
4,executions
5,parse_calls
6,buffer_gets
7,is_bind_sensitive
8,is_bind_aware
9from
10v$sql
11where
12sql_id='5542a2rzny69v';
SQL_IDCHILD_NUMBEREXECUTIONSPARSE_CALLSBUFFER_GETSISIS
---------------------------------------------------------------
5542a2rzny69v0101687396YY
虽然优化器已经标记这个游标is_bind_aware='Y'了,但是依然没有新的游标产生出来。在MOS上查找类似的问题,会发现一个BUG:
Bug8357294:ADAPTIVEcursorSHARINGDOESN'TWORKFORSTATICSQLcursorSFROMPL/SQL
标题的意思是由于BUG,ACS不能工作在PL/SQL的静态游标里。但是根据测试动态游标也不能工作。
SQL>declare
2xinteger;
3nnumber;
4begin
5foriin1..10loop
6ifi=1then
7x:=5000000;
8else
9x:=1;
10endif;
11executeimmediate
12'selectcount(object_id)fromtwhereid>:x'intonusingx;
13endloop;
14end;
15/
PL/SQLproceduresuccessfullycompleted.
SQL>select
2sql_id
3,child_number
4,executions
5,parse_calls
6,buffer_gets
7,is_bind_sensitive
8,is_bind_aware
9from
10v$sql
11where
12sql_id='6qwg6gauwbpm8';
SQL_IDCHILD_NUMBEREXECUTIONSPARSE_CALLSBUFFER_GETSISIS
---------------------------------------------------------------
6qwg6gauwbpm80101687580YN
文中提到了Session_Cached_Cursors在设置为0后,ACS就可以正常工作了,经过试验也如它所说。
SQL>altersessionsetSession_Cached_Cursors=0;
Sessionaltered.
SQL>altersystemflushshared_pool;
Systemaltered.
SQL>declare
2xinteger;
3nnumber;
4begin
5foriin1..10loop
6ifi=1then
7x:=5000000;
8else
9x:=1;
10endif;
11selectcount(object_id)intonfromtwhereid>x;
12endloop;
13end;
14/
PL/SQLproceduresuccessfullycompleted.
SQL>select
2sql_id
3,child_number
4,executions
5,parse_calls
6,buffer_gets
7,is_bind_sensitive
8,is_bind_aware
9from
10v$sql
11where
12sql_id='gp03v5aw085v3';
SQL_IDCHILD_NUMBEREXECUTIONSPARSE_CALLSBUFFER_GETSISIS
---------------------------------------------------------------
gp03v5aw085v302376405YN
gp03v5aw085v3187517480YY
SQL>select*fromtable(dbms_xplan.display_cursor('gp03v5aw085v3',null));
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
SQL_IDgp03v5aw085v3,childnumber0
-------------------------------------
SELECTCOUNT(OBJECT_ID)FROMTWHEREID>:B1
Planhashvalue:3694077449
-------------------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
-------------------------------------------------------------------------------------
|0|SELECTSTATEMENT||||4(100)||
|1|SORTAGGREGATE||1|10|||
|2|TABLEACCESSBYINDEXROWID|T|1|10|4(0)|00:00:01|
|*3|INDEXRANGESCAN|I|1||3(0)|00:00:01|
-------------------------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
3-access("ID">:B1)
SQL_IDgp03v5aw085v3,childnumber1
-------------------------------------
SELECTCOUNT(OBJECT_ID)FROMTWHEREID>:B1
Planhashvalue:2966233522
---------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
---------------------------------------------------------------------------
|0|SELECTSTATEMENT||||14373(100)||
|1|SORTAGGREGATE||1|10|||
|*2|TABLEACCESSFULL|T|4999K|47M|14373(2)|00:02:53|
---------------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
2-filter("ID">:B1)
可以看到ACS已经工作了,在v$sql_cs_histogram里也为新游标产生了新的行。
SQL>SELECThash_value,sql_id,child_number,bucket_id,COUNT
2FROMv$sql_cs_histogram
3WHEREsql_id='gp03v5aw085v3'
4ORDERBYsql_id,child_number;
HASH_VALUESQL_IDCHILD_NUMBERBUCKET_IDCOUNT
---------------------------------------------------------
3087275875gp03v5aw085v3010
3087275875gp03v5aw085v3001
3087275875gp03v5aw085v3021
3087275875gp03v5aw085v3110
3087275875gp03v5aw085v3100
3087275875gp03v5aw085v3128
到此,相信大家对“ACS与PL/SQL的工作情况分析”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。