26 Oracle深度学习笔记——SQL基线

本文深入探讨了Oracle的SQL计划基线,包括其作用、自动捕获、测试方法、创建与维护。通过实例展示了如何利用SQL_ID和SQL文本创建基线,以及如何管理SQL计划基线,包括接受、禁用和删除计划基线。文章还讨论了SQL计划基线在保持执行计划稳定性方面的价值,并提供了实用的测试场景。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

26.Oracle深度学习笔记——SQL基线

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50830903

1.  SQL计划基线

     SQL计划基线可以理解是存储提纲的一个改进版本,不仅和存储提纲有许多相同的特性,而且也和存储提纲一样被设计用来提供稳定的执行计划,以防执行环境和对象统计信息的改变对执行计划产生影响。此外,和存储提纲类似,也可以在不修改语句的情况下调优应用程序。

维持执行计划的稳定性是SQL计划基线唯一被提及的用途.

    SQL计划基线是一个与SQL语句相关联的对象,它被设计用来影响查询优化器产生执行计划时的决定。具体地讲,SQL计划基线主要是一个提示的集合。基本上,SQL计划基线就是用来迫使查询优化器为一条给定的SQL语句产生个特定的、稳定的执行计划。

    有多种方法可用来捕获SQL计划基线。基本上,它们都是由数据库引擎自动创建或数据库管理员手动创建。

2.  基线自动捕获

       当动态初始化参数optimizer_use_sql_plan_baselines设置为true的时候,查询优化器将自动创建一个新的SQL计划基线。这个初始化参数被默认设置为FALSE,可以在系统级和会话级修改它。当自动捕获开启后,查询优化器为每条重复执行过(就是至少执行过两次)的SQL 语句存储一个新的SQL 计划基线。为此.它会将每条SQL 语句的签名插入一个日志中,以便于管理。

    这意味着当一条SQL语句第一次执行的时候,仅把它的签名插入日志。然后,当第二次执行相同的语句的时候,如果不存在与此语句相对应的SQL计划基线,就新建一个并存储起来。如果与SQL语句相对应的SQL计划基线已经存在,查询优化器仍然会对比当前的执行计划和基于此SQL计划基线的执行计划。如果它们不匹配,那么这个描述当前执行计划的新的SQL计划基线将被存储。然而就像你在前面见到的,不能直接使用当前的执行计划。查询优化器被强制使用在SQL 计划基线的辅助下产生的执行计划。

计划基线用来指导优化器始终选择某一个执行计划。通过计划基线,可以将执行计划存储在数据库的表中并进行管理。计划基线由一个或多个已经被接受到的SQL查询执行计划组成。运行一个查询,且该查询已经存在计划基线,优化器就会优先考虑计划基线中的执行计划。

3.  测试

用SQL_ID创建基线

tpcc@TOADDB> create table t as select * fromall_objects;

Table created.
tpcc@TOADDB>create index t_idx on t(object_name);

Index created.

收集统计信息:

tpcc@TOADDB> execdbms_stats.gather_table_stats(user,'t',cascade=>true);

PL/SQL procedure successfully completed.

tpcc@TOADDB> select/*test_01*/object_id,object_type from t where object_name ='DUAL';

 OBJECT_ID OBJECT_TYPE

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

      142 TABLE

      143 SYNONYM

查找所执行SQL的ID

tpcc@TOADDB> select sql_id,sql_text from v$sqlwhere sql_text like 'select /*test_01*/%';

SQL_ID

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

SQL_TEXT

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

farns9fxz7dum

select /*test_01*/object_id,object_typefrom t where object_name ='DUAL'

SQL计划基线的管理,需要拥有administersql management object权限。

查看已有基线:

SQL>select sql_handle,plan_name fromdba_sql_plan_baselines where sql_text like 'select /*test_01*/%';

no rows selected

使用dbms_spm.load_plans_from_cursor_cache加载sql_id对应的SQL的执行计划。

declare

      x pls_integer;

   begin

      x := dbms_spm.load_plans_from_cursor_cache(sql_id => 'farns9fxz7dum');

   end;

  /

再查看创建的基线如下:

tpcc@TOADDB> select sql_handle,plan_name fromdba_sql_plan_baselines where sql_text like 'select /*test_01*/%';

SQL_HANDLE

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

PLAN_NAME

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

SQL_718c094fd7a20a4d

SQL_PLAN_733099zbu42kda0b930be

如此就为需要创建计划基线的SQL创建了计划基线

用sql文本来创建计划基线

如下

tpcc@TOADDB>select object_id from t whereobject_name = 'DUAL';

 OBJECT_ID

----------

      142

      143

declare

       xpls_integer;

    begin

       x :=dbms_spm.load_plans_from_cursor_cache(

               attribute_name => 'SQL_TEXT',

              attribute_value => 'select object_id from t%'); 

      dbms_output.put_line(x);

    end;

  /

PL/SQL procedure successfully completed.

查看如下:

tpcc@TOADDB> select sql_handle,plan_name fromdba_sql_plan_baselines where sql_text like 'select object_id from t%';

SQL_HANDLE

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

PLAN_NAME

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

SQL_b7598beb2a522d9d

SQL_PLAN_bfqcbxcp54bcxa0b930be

显示一条SQL的执行计划

我们可以使用dbms_xplan.display_sql_plan_baseline来完成,如下:

tpcc@TOADDB> select sql_handle

   from dba_sql_plan_baselines

   where plan_name = 'SQL_PLAN_bfqcbxcp54bcxa0b930be'

    /

SQL_HANDLE

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

SQL_b7598beb2a522d9d

tpcc@TOADDB> select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=> 'SQL_b7598beb2a522d9d'));

PLAN_TABLE_OUTPUT

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

 

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

SQL handle: SQL_b7598beb2a522d9d

SQL text: select object_id from t whereobject_name = 'DUAL'

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值