2014-09-24 Created By BaoXinjian
一、摘要
SQL 语句的SQL 执行计划发生更改时,可能存在性能风险。
SQL 计划发生更改的原因有很多,如优化程序版本、优化程序统计信息、优化程序参数、方案定义、系统设计和SQL 概要文件创建等。
SQL 计划管理是一种随Oracle Database 11g 引入的新功能,通过维护所谓的“SQL 计划基线(SQL plan baseline(11g))”来使系统能够自动控制SQL 计划演变。
启用此功能后,只要证明新生成的SQL 计划与SQL 计划基线相集成不会导致性能回归,就可以进行此项集成。
因此,在执行某个SQL 语句时,只能使用对应的SQL 计划基线中包括的计划。可以使用SQL 优化集自动加载或植入SQL 计划基线。
SQL 计划管理功能的主要优点是系统性能稳定,不会出现计划回归。此外,该功能还可以节省DBA 的许多时间,这些时间通常花费在确定和分析SQL 性能回归以及寻找可用的解决方案上。
在oracle的使用中,有时会出现sql执行计划改变导致性能下降的情况。
这种性能不稳定的情况,在有些批处理作业中会导致延误,而重要的在线交易系统如果发生这种问题就会成为故障。
随着Oracle版本演变,不断有新的技术来试图解决这个问题。本篇简单介绍一下这些技术。
1. SQL执行计划不稳定的大概原因有
- 数据库升级,优化器和原来不同了,同样的sql语句有可能生成不同的执行计划。在多个系统的升级过程中都遇到过。
- Table/index上的optimizer statistics过期或丢失。
- 数据量变化后重新统计optimizer statistics,或者增加、删除了索引,优化器可能选择不同的执行计划。
2. 针对这些问题,以往的解决方案有
2.1 使用hint改写sql
Hint可以指定索引,关联方式等等。
缺点是:
- 需要改代码;
- hint需要维护。例如,hint指定索引,但如果索引后来在维护时更改了名字,那么这个hint就失效了。
2.2 Outline
这是oracle10之前采用的技术。简单说,outline就是某个sql的一套hint。
(1). 建立outline
可以在系统级别或session级别,设置CREATE_STORED_OUTLINES参数。
例如,alter session set CREATE_STORED_OUTLINES=true。这样该session之后运行的sql就都会被创建outline。
也可以为单个sql创建outline
CREATE OR REPLACE OUTLINE test_bip_outline01 FOR CATEGORY TEST ON
SELECT BILLING_ACCOUNT_NO, …
FROM NRC, NRC_KEY
WHERE BILLING_ACCOUNT_NO = :B2 AND BILL_REF_NO = 0
(2). 使用outline
如果创建outline时sql运行性能良好,那么可以使用这些outline,以后运行时就会用同样的执行计划。
Alter system|session use_stored_outlines=true。
(3). Outline存在以下缺点:
- 没有进化机制。例如当数据量变化,outline中当初最优的执行计划性能不再是最优的。
- 对于一个sql只能选择一个outline。
- 缺乏主动预先发现性能问题的能力。通常出现性能问题后dba才会去用outline进行调优。
- Hint和outline称为plan stability技术。由于上面提到的缺点,oracle10g开始引入了一些新的技术。
2.3 Sql Profile
关于sql的补充信息,保存在数据字典中,用来帮助优化器选择执行计划。(可以这么理解,sql的profile,相当于table/index的optimizer statistics)
2.4 SQL Pan Baseline
前面提到,outline是sql的一套hint。和outline不同,sql plan baseline是sql的一套执行计划。
5. 总结
各种技术都有不同的适用场合,例如hint尽管存在许多缺点,但有时程序使用动态sql,表名都肯是变化的,这是就只能使用hint来固定执行计划了。
这是oracle 10g之前的概念 (plan stability),主要是通过hint和outline实现。这两种技术存在的缺点是:
- Hint需要维护,例如hint中的索引名字如果发生变更,hint就失效了。
- 没有进化机制,一个sql只有一个固定的执行计划。当环境变化(例如数据量变化),当初选择的执行计划性能不再是最优的,hint和outline技术不能发现这点,执行计划不能‘与时俱进’。
6. 10g开始,Oracle提出了执行计划管理的概念(SQL Plan Management,简写为SPM),先介绍SPM的几个概念
(1). SQL Plan History
对于一个sql,其运行历史中由于统计信息变化,或添加了索引等,可能产生不同的执行计划,这些计划都会保存在该sql的sql plan history。
(2). Sql Plan Baseline
用户评估其中哪些计划是性能上可以接受的。执行计划被接受后,就进入sql plan baseline中。
二、SQL Plan Baseline过程:抓取 选择 演化
Step1. 抓取
1.1 Capture sql plan baseline(抓取)
(1). 设置参数自动抓取,
初始化参数:OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=true
则自动抓取系统中所有sql的sql plan
(2). 从awr/sql tuning set/shared pool中载入
(3). 对于老版本升级上来的系统,还可以将stored outline转换为sql plan
从目前的实践看,将存在性能不稳定问题的或者业务核心的sql从awr/shared pool中单独载入是比较可行的方法。
1.2 结构图