控制执行计划之-SPM BASELINE(四)

Baseline Internal

 我们接着上面一节继续来思考,一个SQL在dba_sql_plan_baselines中存在2个accepted为YES状态的baseline。优化器如何决定使用哪一个?看到网上有些文章提到是依据dba_sql_plan_baselines. OPTIMIZER_COST来决定,哪个baseline对应的执行计划的cost小,就使用哪个。但是很容易验证说法是错误的。我们可以修改dba_sql_plan_baselines视图的基表sqlobj$auxdata中的OPTIMIZER_COST字段,来调整2个baseline的OPTIMIZER_COST的大小,但是实验结果最终证明是无效的,并不是通过dba_sql_plan_baselines. OPTIMIZER_COST的大小来决定使用哪个baseline。实验结果这里不再贴出。那到底是如何决定呢?这个要根据系统的配置来定,我们接着上面的例子,但是先关闭ACS,但是绑定变量窥探的功能保持打开。

test@DLSP>show parameter _optimizer_extended_cursor_sharing_rel

 

NAME                                   TYPE                   VALUE

-------------------------------------- ---------------------- --------

_optimizer_extended_cursor_sharing_rel string                 NONE

 

test@DLSP>show parameter bind

 

NAME                                 TYPE                   VALUE

------------------------------------ ---------------------- -----------

_optim_peek_user_binds               boolean                TRUE

 

test@DLSP>alter system flush shared_pool;

 

System altered.

提示:针对这个SQL当前在dba_sql_plan_baselines视图中存在2个baseline。

test@DLSP>ALTER SYSTEM FLUSH SHARED_POOL;

 

System altered.

 

test@DLSP>var a varchar2(100)

test@DLSP>exec :a :='Inactive'

 

PL/SQL procedure successfully completed.

 

test@DLSP>select count(name) from test where status= :a;

 

COUNT(NAME)

-----------

        100

 

test@DLSP>select * from table(dbms_xplan.display_cursor);

 

PLAN_TABLE_OUTPUT

------------------------------------------------------------------------------------------------------------------------------------------------------

SQL_ID  aa8mzbnrzu42f, child number 0

-------------------------------------

select count(name) from test where status= :a

 

Plan hash value: 4130896540

 

--------------------------------------------------------------------------------------

| Id  | Operation                    | Name  | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |       |       |       |     2 (100)|          |

|   1 |  SORT AGGREGATE              |       |     1 |    25 |            |          |

|   2 |   TABLE ACCESS BY INDEX ROWID| TEST  |   100 |  2500 |     2   (0)| 00:00:01 |

|*  3 |    INDEX RANGE SCAN          | T_IND |   100 |       |     1   (0)| 00:00:01 |

--------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   3 - access("STATUS"=:A)

 

Note

-----

   - SQL plan baseline SQL_PLAN_636ys750p7z8519ccc485 used for this statement

 

当对status的绑定值传入Inactive时,选用了我们进化后的baseline。由于列上存在直方图信息,我们看到了执行计划的输出基数部分非常的准确。这也要归功于绑定变量窥探的作用。上面读者可以再继续试试多次执行这个SQL,执行计划都会一直使用索引扫描。我们继续试验,看看重新刷新共享池,对status的绑定之传入Active会怎么样:

test@DLSP>alter system flush shared_pool;

 

System altered.

 

test@DLSP>exec :a :='Active';

 

PL/SQL procedure successfully completed.

 

test@DLSP>select count(name) from test where status= :a;

 

COUNT(NAME)

-----------

      49900

 

test@DLSP>select * from table(dbms_xplan.display_cursor);

 

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------

SQL_ID  aa8mzbnrzu42f, child number 0

-------------------------------------

select count(name) from test where status= :a

 

Plan hash value: 1950795681

 

---------------------------------------------------------------------------

| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |      |       |       |    51 (100)|          |

|   1 |  SORT AGGREGATE    |      |     1 |    25 |            |          |

|*  2 |   TABLE ACCESS FULL| TEST | 49900 |  1218K|    51   (2)| 00:00:01 |

---------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   2 - filter("STATUS"=:A)

 

Note

-----

   - SQL plan baseline SQL_PLAN_636ys750p7z856b581ab9 used for this statement

已经选用了我们最初创建的baseline,执行计划已经走了全表扫描了。虽然baseline的作用是为了稳固执行计划,但是就像我们看到的,由于同一个SQL存在2个可接受的baseline,因此执行计划发生了不稳固的现象,绑定变量窥探的害处在这里又重新体现出来了。其实绑定变量和ACS都会在baseline起作用前就会发生,但是绑定变量窥探和ACS发挥作用后产生的执行计划必须从baseline中选用。因此就会发生前面产生的场景,绑定变量窥探导致已经使用baseline的SQL的执行计划不稳定。这种情况可以通过ACS来解决:

--------开启ACS

test@DLSP>alter system set "_optimizer_extended_cursor_sharing_rel"=simple ;

 

System altered.

 

test@DLSP>alter system flush shared_pool;

 

System altered.

 

test@DLSP>exec :a :='Active';

 

PL/SQL procedure successfully completed.

 

test@DLSP>select count(name) from test where status= :a;

 

COUNT(NAME)

-----------

      49900

 

test@DLSP>select * from table(dbms_xplan.display_cursor);

 

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------

SQL_ID  aa8mzbnrzu42f, child number 0

-------------------------------------

select count(name) from test where status= :a

 

Plan hash value: 1950795681

 

---------------------------------------------------------------------------

| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |      |       |       |    51 (100)|          |

|   1 |  SORT AGGREGATE    |      |     1 |    25 |            |          |

|*  2 |   TABLE ACCESS FULL| TEST | 49900 |  1218K|    51   (2)| 00:00:01 |

---------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   2 - filter("STATUS"=:A)

 

Note

-----

   - SQL plan baseline SQL_PLAN_636ys750p7z856b581ab9 used for this statement

 

 

23 rows selected.

 

test@DLSP> -- 检查ACS状态

test@DLSP>SELECT child_number, executions, buffer_gets, is_bind_sensitive,IS_SHAREABLE,

  2           is_bind_aware

  3      FROM v$sql

  4     WHERE sql_id='aa8mzbnrzu42f';

 

CHILD_NUMBER EXECUTIONS BUFFER_GETS IS IS IS

------------ ---------- ----------- -- -- --

           0          1         452 Y  Y  N

 

-- 直方图

SELECT   hash_value, sql_id, child_number, bucket_id, COUNT

test@DLSP>test@DLSP>  2        FROM v$sql_cs_histogram

  3       WHERE sql_id='aa8mzbnrzu42f'

  4    ORDER BY sql_id, child_number;

 

HASH_VALUE SQL_ID                     CHILD_NUMBER  BUCKET_ID      COUNT

---------- -------------------------- ------------ ---------- ----------

 805113934 aa8mzbnrzu42f                         0          0          0

 805113934 aa8mzbnrzu42f                         0          2          0

 805113934 aa8mzbnrzu42f                         0          1          1

 

test@DLSP>exec :a :='Inactive';

 

PL/SQL procedure successfully completed.

 

test@DLSP>select count(name) from test where status= :a;

 

COUNT(NAME)

-----------

        100

 

test@DLSP> -- 检查ACS状态

test@DLSP>SELECT child_number, executions, buffer_gets, is_bind_sensitive,IS_SHAREABLE,

  2           is_bind_aware

  3      FROM v$sql

  4     WHERE sql_id='aa8mzbnrzu42f';

 

CHILD_NUMBER EXECUTIONS BUFFER_GETS IS IS IS

------------ ---------- ----------- -- -- --

           0          2         662 Y  Y  N

 

 

test@DLSP>-- 直方图

test@DLSP>SELECT   hash_value, sql_id, child_number, bucket_id, COUNT

  2        FROM v$sql_cs_histogram

  3       WHERE sql_id='aa8mzbnrzu42f'

  4    ORDER BY sql_id, child_number;

 

HASH_VALUE SQL_ID                     CHILD_NUMBER  BUCKET_ID      COUNT

---------- -------------------------- ------------ ---------- ----------

 805113934 aa8mzbnrzu42f                         0          0          1

 805113934 aa8mzbnrzu42f                         0          2          0

 805113934 aa8mzbnrzu42f                         0          1          1

 

test@DLSP>select count(name) from test where status= :a;

 

COUNT(NAME)

-----------

        100

 

test@DLSP> -- 检查ACS状态

test@DLSP>SELECT child_number, executions, buffer_gets, is_bind_sensitive,IS_SHAREABLE,

  2           is_bind_aware

  3      FROM v$sql

  4     WHERE sql_id='aa8mzbnrzu42f';

 

CHILD_NUMBER EXECUTIONS BUFFER_GETS IS IS IS

------------ ---------- ----------- -- -- --

           0          2         662 Y  N  N

           1          1         102 Y  Y  Y

 

test@DLSP>-- 直方图

test@DLSP>SELECT   hash_value, sql_id, child_number, bucket_id, COUNT

  2        FROM v$sql_cs_histogram

  3       WHERE sql_id='aa8mzbnrzu42f'

  4    ORDER BY sql_id, child_number;

 

HASH_VALUE SQL_ID                     CHILD_NUMBER  BUCKET_ID      COUNT

---------- -------------------------- ------------ ---------- ----------

 805113934 aa8mzbnrzu42f                         0          1          1

 805113934 aa8mzbnrzu42f                         0          0          1

 805113934 aa8mzbnrzu42f                         0          2          0

 805113934 aa8mzbnrzu42f                         1          1          0

 805113934 aa8mzbnrzu42f                         1          0          1

 805113934 aa8mzbnrzu42f                         1          2          0

 

6 rows selected.

 

--------查看child_number为1的执行计划

test@DLSP>select * from table(dbms_xplan.display_cursor('aa8mzbnrzu42f',1));

 

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------

SQL_ID  aa8mzbnrzu42f, child number 1

-------------------------------------

select count(name) from test where status= :a

 

Plan hash value: 4130896540

 

--------------------------------------------------------------------------------------

| Id  | Operation                    | Name  | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |       |       |       |     2 (100)|          |

|   1 |  SORT AGGREGATE              |       |     1 |    25 |            |          |

|   2 |   TABLE ACCESS BY INDEX ROWID| TEST  |   100 |  2500 |     2   (0)| 00:00:01 |

|*  3 |    INDEX RANGE SCAN          | T_IND |   100 |       |     1   (0)| 00:00:01 |

--------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   3 - access("STATUS"=:A)

 

Note

-----

   - SQL plan baseline SQL_PLAN_636ys750p7z8519ccc485 used for this statement

 

test@DLSP>exec :a :='Active';

 

PL/SQL procedure successfully completed.

 

test@DLSP>select count(name) from test where status= :a;

 

COUNT(NAME)

-----------

      49900

 

test@DLSP> -- 检查ACS状态

test@DLSP>SELECT child_number, executions, buffer_gets, is_bind_sensitive,IS_SHAREABLE,

  2           is_bind_aware

  3      FROM v$sql

  4     WHERE sql_id='aa8mzbnrzu42f';

 

CHILD_NUMBER EXECUTIONS BUFFER_GETS IS IS IS

------------ ---------- ----------- -- -- --

           0          2         662 Y  N  N

           1          1         102 Y  Y  Y

           2          1         210 Y  Y  Y

 

test@DLSP>-- 直方图

test@DLSP>SELECT   hash_value, sql_id, child_number, bucket_id, COUNT

  2        FROM v$sql_cs_histogram

  3       WHERE sql_id='aa8mzbnrzu42f'

  4    ORDER BY sql_id, child_number;

 

HASH_VALUE SQL_ID                     CHILD_NUMBER  BUCKET_ID      COUNT

---------- -------------------------- ------------ ---------- ----------

 805113934 aa8mzbnrzu42f                         0          1          1

 805113934 aa8mzbnrzu42f                         0          0          1

 805113934 aa8mzbnrzu42f                         0          2          0

 805113934 aa8mzbnrzu42f                         1          0          1

 805113934 aa8mzbnrzu42f                         1          1          0

 805113934 aa8mzbnrzu42f                         1          2          0

 805113934 aa8mzbnrzu42f                         2          1          1

 805113934 aa8mzbnrzu42f                         2          0          0

 805113934 aa8mzbnrzu42f                         2          2          0

 

9 rows selected.

 

test@DLSP>select * from table(dbms_xplan.display_cursor('aa8mzbnrzu42f',2));

 

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------

SQL_ID  aa8mzbnrzu42f, child number 2

-------------------------------------

select count(name) from test where status= :a

 

Plan hash value: 1950795681

 

---------------------------------------------------------------------------

| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------

|   0 | SELECT STATEMENT   |      |       |       |    51 (100)|          |

|   1 |  SORT AGGREGATE    |      |     1 |    25 |            |          |

|*  2 |   TABLE ACCESS FULL| TEST | 49900 |  1218K|    51   (2)| 00:00:01 |

---------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   2 - filter("STATUS"=:A)

 

Note

-----

   - SQL plan baseline SQL_PLAN_636ys750p7z856b581ab9 used for this statement

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-1241481/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22034023/viewspace-1241481/

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值