之前的几篇文章: 《一个执行计划异常变更的案例 - 前传》 《一个执行计划异常变更的案例 - 外传之绑定变量窥探》 《一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法》 《一个执行计划异常变更的案例 - 外传之rolling invalidation》 《一个执行计划异常变更的案例 - 外传之聚簇因子(Clustering Factor)》 《一个执行计划异常变更的案例 - 外传之查询执行计划的几种方法》 《一个执行计划异常变更的案例 - 外传之AWR》 《一个执行计划异常变更的案例 - 外传之ASH》 《一个执行计划异常变更的案例 - 外传之SQL AWR》 《一个执行计划异常变更的案例 - 外传之直方图》
这个系列文章已经连载了多篇,节后这几天工作生活都比较忙,只能利用碎片时间继续,接下来的两篇博文都是关于SQL Profile的,然后就可以进入正传了:)
首先,老熊的两篇SQL Profile的博文,以及dbsnake书中第二章关于SQL Profile的介绍,是我认为中文介绍SQL Profile最好的两个学习来源,本文中的一些观点和案例会从中借鉴一些。
从MOS上我们看下什么是SQL Profile,
SQL Profile is a collection of information stored in the data dictionary that enables the query optimizer to create an optimal execution plan for a SQL statement.The SQL profile contains corrections for poor optimizer estimates discovered during Automatic SQL Tuning. This information can improve optimizer cardinality and selectivity estimates, which in turn leads the optimizer to select better plans..
SQL Profile是一组存储在数据字典中的信息,目的就是为了创建最优的SQL执行计划,通过使用自动SQL调优工具,提高优化器对cardinality和selectivity的预估,以纠正错误的执行计划。
说白了,SQL Profile是一组数据字典信息,可以提高优化器对cardinality和selectivity的预估进而影响执行计划的成本计算,达到选择正确执行计划的目的。
SQL Profile是从10g开始引入的,SQL Profile相比于Outline的优点: 1.SQL Profiles更容易生成、更改和控制。 2.SQL Profiles在对SQL语句的支持上做得更好,也就是适用范围更广。
使用SQL Profiles的两个目的: 1.锁定或者说是稳定执行计划。 2.在不能修改应用中的SQL的情况下使SQL语句按指定的执行计划运行。
SQL Profile有两种类型,一种是Automatic类型,另一种是Manual类型,本篇文章会介绍前者,下一篇会介绍后者。
创建测试表,t1表10000条记录,t2表50000条记录。
t2表的id列创建非唯一索引,收集t1和t2表和索引的统计信息,不收集直方图,
执行这条SQL语句,Oracle选择了两表全表扫描,再做Hash Join的执行计划,逻辑读221,
实际t1表符合t1.name like ‘
