稳固执行计划

简介: SQL优化

①创建大纲
 create or replace outline outln_t1 for category category_t1 on select * from t1 where id=1;

alter system set use_stored_outlines=category_t1; --激活一个类目的存储大纲
--select sql_id,hash_value,child_number from v$sql where sql_text like 'select * from t1 where id=1;%';
--exec dbms_outln.create_outline(sql_id,'DEFAULT'); --通过过程创建
select category,ol_name,hintcount hints,sql_text from outln.ol$;

②将现有OUTLINE复制到新建的私有的OUTLINE中去 --1.当前会话下修改不影响其它会话,2.已存在outline需要修改时
 create private outline prv_ol_t1 from outln_t1;

 create private outline prv_ol_temp on select /*+ full(t1) */ * from t1 where id=1;--用提示生成一个全表扫描计划

③修改大纲(可以使用dbms_outln_edit包中所提供的过程进行修改或直接修改ol$hints)

SQL> select category,ol_name,hintcount hints,sql_text from outln.ol$;  --公有大纲的提示数量
SQL> select ol_name,hint_text from outln.ol$hints;                    --公有大纲的提示内容
SQL> select category,ol_name,hintcount hints,sql_text from ol$;      --私有大纲的提示数量

  SQL> select ol_name,hint_text from ol$hints;     --私有大纲的提示内容
     OL_NAME HINT_TEXT
    ------------------------------ -------------------------
    PRV_OL_T1 OUTLINE_LEAF(@"SEL$1")
    PRV_OL_T1 IGNORE_OPTIM_EMBEDDED_HINTS
    PRV_OL_T1 OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
    PRV_OL_T1 DB_VERSION('11.2.0.3')
    PRV_OL_T1 ALL_ROWS
    PRV_OL_T1 INDEX_RS_ASC(@"SEL$1" "T1"@"SEL$1" ("T1"."ID"))
    PRV_OL_TEMP FULL(@"SEL$1" "T1"@"SEL$1")
    PRV_OL_TEMP OUTLINE_LEAF(@"SEL$1")
    PRV_OL_TEMP ALL_ROWS
    PRV_OL_TEMP DB_VERSION('11.2.0.3')
    PRV_OL_TEMP OPTIMIZER_FEATURES_ENABLE('11.2.0.3')
    PRV_OL_TEMP IGNORE_OPTIM_EMBEDDED_HINTS
  --直接修改ol$hints(私有大纲的提示内容)

 UPDATE ol$hints SET ol_name=DECODE(OL_NAME,'PRV_OL_T1','PRV_OL_TEMP','PRV_OL_TEMP','PRV_OL_T1')
 WHERE ol_name IN ('PRV_OL_T1','PRV_OL_TEMP');
 --直接修改ol$hints(私有大纲的提示数量)
 UPDATE ol$ ol1 SET hintcount=(SELECT hintcount FROM ol$ ol2 WHERE ol2.ol_name IN ('PRV_OL_T1','PRV_OL_TEMP') AND ol2.ol_name != ol1.ol_name) WHERE ol1.ol_name IN ('PRV_OL_T1','PRV_OL_TEMP');

④在修改之后必须使用refresh_private_outline过程对上述私有outline进行刷新

  EXEC DBMS_OUTLN_EDIT.REFRESH_PRIVATE_OUTLINE ('PRV_OL_T1');

⑤为了对创建的私有OUTLINE进行检查而需要将参数use_private_outlines设置为true

 alter session set use_private_outlines=true;

⑥在充分的检查结束后,能过执行下面的操作来达到共享使用的目的
 create or replace outline outln_t1 from private PRV_OL_T1;

⑦在共享使用转换结束后,通过将参数use_private_outlines设置为false来结束修改之前的私有outline的执行

 alter session set use_private_outlines=false;

⑧OUTLINE的观察:dba_outlines、dba_outline_hints

select  hint from dba_outline_hints where name='OUTLN_T1';
相关文章
|
9月前
|
缓存 关系型数据库 Java
哈啰一面:如何优化大表的查询速度?
哈啰一面:如何优化大表的查询速度?
184 1
哈啰一面:如何优化大表的查询速度?
|
24天前
|
分布式计算 关系型数据库 数据处理
深度揭秘:ADB之外的数据库战场,Planner与ORCA优化器,谁才是性能提升的幕后推手?
【8月更文挑战第27天】在数据库和Android调试领域,优化器如Planner与ORCA扮演着提升性能的关键角色。Planner作为传统数据库的核心,以成熟稳定、高度集成及易于扩展著称,适用于大多数查询优化场景。ORCA则凭借其模块化设计、高并发性和基于成本的优化策略,在处理复杂查询和大规模数据集时展现出色性能。尽管ADB本身不包含这些优化器,但其调试理念与优化器的设计理念相辅相成,共同推动技术进步。例如,在使用ORCA的数据库中,一个涉及多表连接的复杂查询可以被自动优化,通过评估不同连接策略的成本来选择最佳执行计划。这两种优化器各有所长,共同促进数据处理技术的发展。
41 0
|
3月前
|
SQL 关系型数据库 MySQL
从理论到实践,Mysql查询优化剖析(联表查询)
从理论到实践,Mysql查询优化剖析(联表查询)
102 0
|
20天前
|
SQL 数据挖掘 数据库
SQL 子查询深度剖析来袭!嵌套查询竟有如此无限可能,带你轻松玩转复杂数据检索与操作!
【8月更文挑战第31天】在 SQL 中,子查询是一种强大的工具,允许在一个查询内嵌套另一个查询,从而实现复杂的数据检索和操作。子查询分为标量子查询、列子查询和行子查询,可用于 SELECT、FROM、WHERE 和 HAVING 子句中。例如,查找年龄大于平均年龄的学生或每个课程中成绩最高的学生。子查询具有灵活性、可重用性和潜在的性能优化优势,但需注意性能问题、可读性和数据库支持。合理使用子查询能够显著提升查询效率和代码维护性。
31 0
|
2月前
|
缓存 搜索推荐 关系型数据库
现代数据库系统中的索引优化策略探析
数据库系统中的索引优化是保证高效查询和数据操作的关键。本文深入探讨了现代数据库系统中常用的索引优化策略,包括B+树索引、哈希索引以及全文索引的工作原理和应用场景。通过详细分析和比较,读者可以更好地理解在不同场景下如何选择和优化索引,从而提升数据库系统的性能和响应速度。
|
4月前
|
SQL 分布式计算 数据处理
奇思妙想的SQL|兼顾性能的数据倾斜处理新姿势
文章分享了在支付宝支付数据链路改造升级过程中,针对数据倾斜的优化实践新方法,在解决数据倾斜问题的同时,还能兼顾更优的计算性能!
|
4月前
|
缓存 关系型数据库 MySQL
研优化数据库查询性能
研优化数据库查询性能
40 0
|
10月前
|
存储 关系型数据库 MySQL
太强了!三种方案优化 2000w 数据大表!
太强了!三种方案优化 2000w 数据大表!
141 0
|
11月前
|
SQL 关系型数据库 MySQL
106分布式电商项目 - MySQL优化(查询优化)
106分布式电商项目 - MySQL优化(查询优化)
63 0
|
缓存 关系型数据库 MySQL
mysql查询慢是为什么 怎么改善43.242.205.12
mysql查询慢是为什么 怎么改善43.242.205.12