首页 > Oracle > Oracle sql profile的介绍及其作用!
2014
03-27

Oracle sql profile的介绍及其作用!

sql profile是oracle 10g就推出来的新特性,在优化sql当中,可能这种方法用得并不是很多,但有时往往就需要sql profile方式来优化sql。这种优化方式和之前的outlines有点相像,可以说sql profile是outlines的升级,因为它可以实现outlines的所有功能,并且比outlines更容易控制,支持也比outlines好很多。

在一般情况下,我们优化sql语句的时候,可能需要修改sql语句,但如果sql语句由应用程序生成,无法修改,那么在优化sql的时候就可以使用sql profile,用来稳定sql的执行计划,这样就不用修改sql语句,直接固定执行计划。下面通过测试来说明一下sql profile的作用:

1. 创建test表,并创建索引

2. 查看一个简单sql的执行计划,毫无疑问这里会使用都索引

3. 假使这里我们需要全表扫描,不需要通过索引,我们可以在sql中使用hint来指定test表使用全表扫描

这里也可以对比sql的逻辑读和物理读,在有索引的情况下,CBO还是能正确的判断sql是否应该走索引的方式。如果我们在sql中不使用full(test)这个hint,那么sql就会选择索引扫描,下面我们通过sql profile来固定这个sql的执行计划。

4. 手工创建一个sql profile

5. 执行一下原始sql语句,可以看到此时sql的执行计划还是走的索引扫描,sql profile没有生效

6. 我们重新定义一下sql profile

此时我们可以发现,原始sql的执行计划变成了全表扫描,而我们也没有修改sql,没有添加hint,通过sql profile的方式改变固定了sql的执行计划。当然我们也可以使用sql产生的outline来创建sql profile

7. 首先得到sql的sql id,然后通过sql id得到outline

8. 通过outline创建sql profile

9. 直接执行sql,查看是否应用了sql profile

可以看到sql选择了全表扫描,sql profile生效。

10. 删掉这个sql profile后,CBO选择了索引扫描

此外我们还可以通过sql id创建sql profile,方式和第一种通过sql text方式一致。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL