SQL计划捕获是指用于在一组SQL语句的SQL管理库中捕获和存储有关计划的相关信息的技术。
捕获计划意味着使SQL计划管理人员意识到该计划。您可以通过设置初始化参数将初始计划捕获配置为自动发生,也可以使用DBMS_SPM软件包手动捕获计划。
本节包含以下主题:
27.3.1自动初始计划捕获
启用后,数据库将检查执行的SQL语句是否适合自动捕获。
您可以通过设置为(默认值为)来启用自动初始计划捕获。请注意,初始化参数是独立的。例如,如果为is ,则数据库创建初始计划基线,而不管是否为is 或。OPTIMIZER_CAPTURE_SQL_PLAN_BASELINEStruefalseOPTIMIZER_USE_SQL_PLAN_BASELINESOPTIMIZER_CAPTURE_SQL_PLAN_BASELINEStrueOPTIMIZER_USE_SQL_PLAN_BASELINEStruefalse
本节包含以下主题:
- 自动初始计划捕获的资格 要符合自动计划捕获的条件,已执行的语句必须是可重复的,并且任何捕获筛选器都不能将其排除。
- 自动初始计划捕获的计划匹配 如果数据库执行可重复的SQL语句,并且该语句通过
DBMS_SPM.CONFIGURE过滤器,则数据库将尝试匹配SQL计划基线中的计划。
也可以看看:
- “ 计划选择 ”
- Oracle数据库参考,了解
OPTIMIZER_USE_SQL_PLAN_BASELINES初始化参数
27.3.1.1有资格获得自动初始计划
为了有资格进行自动计划捕获,已执行的语句必须是可重复的,并且不得被任何捕获过滤器排除。
默认情况下,数据库认为所有可重复的SQL语句都符合捕获条件,但以下情况除外:
CREATE TABLE未指定AS SELECT子句时DROP TABLEINSERT INTO ... VALUES
资格的第一个检查是重复执行。如果语句执行少于两次,则数据库认为该语句不符合SQL计划基线。如果一条语句至少执行两次,那么根据定义它是可重复的,因此数据库认为它有资格进行进一步检查。
注意:
SQL计划管理不保护已使用解释EXPLAIN PLAN但尚未执行的语句。
对于可重复的语句,该DBMS_SPM.CONFIGURE过程使您可以创建自动捕获过滤器。因此,您可以仅捕获所需的语句,并排除非关键语句,从而节省SYSAUX表空间。非关键查询通常具有以下特征:
- 没有足够频繁地执行就足够了
- 不占用资源
- 不够复杂,无法从SQL计划管理中受益
对于指定的参数,筛选器将包括(allow=>TRUE)或排除(allow=>FALSE)具有指定值的语句的计划。为了有资格被捕获,任何过滤器都不能排除可重复的语句。该DBMS_SPM.CONFIGURE过程支持用于SQL文本,解析模式名称,模块和操作的过滤器。
任何参数的null值都将删除过滤器。通过parameter_value=>'%'与结合使用allow=FALSE,您可以过滤出参数的所有值,然后创建一个单独的过滤器以仅包含指定的值。该DBA_SQL_MANAGEMENT_CONFIG视图显示当前的过滤器。
也可以看看:
- “ 配置用于自动计划捕获的过滤器 ”
- Oracle Database PL / SQL软件包和类型参考,以了解有关该
DBMS_SPM.CONFIGURE过程的 更多信息 - Oracle数据库参考以了解有关
DBA_SQL_MANAGEMENT_CONFIG视图的 更多信息
27.3.1.2自动匹配初始计划的计划匹配
如果数据库执行可重复的SQL语句,并且该语句通过DBMS_SPM.CONFIGURE过滤器,则数据库将尝试匹配SQL计划基线中的计划。
对于自动初始计划捕获,计划匹配算法如下:
- 如果不存在SQL计划基线,那么优化器将为该语句创建计划历史记录和SQL计划基线,将该语句的初始计划标记为已接受,并将其添加到SQL计划基线中。
- 如果存在SQL计划基准,那么优化程序的行为取决于解析时派生的基于成本的计划:
- 如果此计划与SQL计划基线中的计划不匹配,则优化器会将新计划标记为不可接受,并将其添加到SQL计划基线中。
- 如果这个计划不匹配的SQL计划基准计划,再没有什么被添加到SQL计划基准。
27.3.2手动计划捕获
在SQL计划管理中,手动计划捕获是指用户启动的现有计划到SQL计划基线的批量加载。
使用Cloud Control或PL / SQL从AWR,SQL调优集(STS),共享的SQL区域,登台表或存储的大纲中加载SQL语句的执行计划。
图27-2将计划加载到SQL计划基准中
加载行为因批量加载中表示的每个语句是否存在SQL计划基准而有所不同:
- 如果该语句的基准不存在,那么数据库将执行以下操作:
- 为报表创建计划历史记录和计划基线
- 将声明的初始计划标记为已接受
- 将计划添加到新基线
- 如果存在该语句的基准,那么数据库将执行以下操作:
- 将加载的计划标记为已接受
- 将计划添加到报表的计划基线,而不验证计划的绩效
手动加载的计划始终被标记为“接受”,因为优化器假定管理员手动加载的任何计划都具有可接受的性能。您可以通过在功能中将enabled参数设置为来加载计划而不启用它们。NODBMS_SPM.LOAD_PLANS_FROM_%
也可以看看:
Oracle Database PL / SQL软件包和类型参考,以了解有关功能的 更多信息DBMS_SPM.LOAD_PLANS_FROM_%




