暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 用于SQL计划管理的存储体系结构

原创 Asher.HU 2021-02-04
717


SQL计划管理基础结构记录已解析语句的签名以及接受和不接受的计划。

本节包含以下主题:

 

27.6.1 SQL管理库

SQL管理碱(SMB)是在数据字典的逻辑存储库。

SMB包含以下内容:

  • SQL语句日志,仅包含SQL ID
  • SQL计划历史记录,其中包括SQL计划基线
  • SQL配置文件
  • SQL补丁

SMB存储信息,优化器可使用该信息来维护或改善SQL性能。

SMB驻留在SYSAUX表空间中,并使用自动段空间管理。由于SMB完全位于SYSAUX表空间内,因此当该表空间不可用时,数据库将不使用SQL计划管理和SQL调整功能。

图27-5 SMB架构


注意:

将SMB与可插入数据库一起使用时,数据可见性和特权要求可能会有所不同。请参阅《Oracle数据库管理指南》中的表,该表总结了可管理性功能如何在容器数据库(CDB)中工作。

也可以看看:

《 Oracle数据库管理员指南》以了解SYSAUX表空间


27.6.2 SQL语句日志

启用自动SQL计划捕获后,SQL语句日志将包含优化程序随时间评估的语句的签名。

一个SQL签名是使用已归为不区分大小写和空格SQL语句的文本计算出的数字哈希值。当优化器解析一条语句时,它会创建签名。

在自动捕获期间,数据库将此签名与SQL语句日志(SQLLOG$相匹配,以确定之前是否已观察到签名。如果还没有,则数据库将签名添加到日志中。如果签名已经在日志中,那么数据库将确认该语句是可重复的SQL语句

注意:

如果过滤器排除一条语句,则其签名也将从日志中排除。

示例27-1记录SQL语句

此示例说明了数据库如何跟踪语句日志中的语句并自动为可重复语句创建基线。语句日志的初始查询未显示任何跟踪的SQL语句。在查询hr.jobsfor之后AD_PRES,日志显示一条被跟踪的语句。

SQL> ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=true;

System altered.

SQL> SELECT * FROM SQLLOG$;
 
no rows selected
 
SQL> SELECT job_title FROM hr.jobs WHERE job_id = 'AD_PRES';
 
JOB_TITLE
-----------------------------------
President
 
SQL> SELECT * FROM SQLLOG$;
 
 SIGNATURE     BATCH#
---------- ----------
1.8096E+19          1

现在,该会话执行另一个jobs查询。该日志显示了两个跟踪的语句:

SQL> SELECT job_title FROM hr.jobs WHERE job_id='PR_REP';
 
JOB_TITLE
-----------------------------------
Public Relations Representative
 
SQL> SELECT * FROM SQLLOG$;
 
 SIGNATURE     BATCH#
---------- ----------
1.7971E+19          1
1.8096E+19          1

的查询DBA_SQL_PLAN_BASELINES显示,这两个语句都不存在基线,因为这两个语句均不可重复:

SQL> SELECT SQL_HANDLE, SQL_TEXT 
  2  FROM DBA_SQL_PLAN_BASELINES 
  3  WHERE SQL_TEXT LIKE 'SELECT job_title%';
 
no rows selected

会话job_id='PR_REP'第二次执行查询由于此语句现在是可重复的,并且由于启用了自动SQL计划捕获,因此数据库将为此语句创建计划基线。查询job_id='AD_PRES'仅执行一次,因此没有计划基准。

SQL> SELECT job_title FROM hr.jobs WHERE job_id='PR_REP';
 
JOB_TITLE
-----------------------------------
Public Relations Representative
 
SQL> SELECT SQL_HANDLE, SQL_TEXT 
  2  FROM DBA_SQL_PLAN_BASELINES 
  3  WHERE SQL_TEXT LIKE 'SELECT job_title%';
 
SQL_HANDLE           SQL_TEXT
-------------------- --------------------
SQL_f9676a330f972dd5 SELECT job_title FRO
                     M hr.jobs WHERE job_
                     id='PR_REP'

也可以看看:


27.6.3 SQL计划历史记录

SQL计划历史记录是一组捕获的SQL执行计划。历史记录包含SQL计划基准和不可接受的计划。

在SQL计划管理中,数据库为现有SQL计划基线检测新的SQL执行计划,并将新计划记录在历史记录中,以便可以进行发展(验证)。演化由数据库自动启动,或由DBA手动启动。

Oracle Database 12c开始,SMB将所有SQL语句的执行计划存储在SQL计划历史记录中。DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE功能从SMB获取并显示计划。对于在Oracle Database 12c之前创建的计划,该函数必须编译SQL语句并生成计划,因为SMB不存储该计划。

本节包含以下主题:

也可以看看:

 

27.6.3.1启用的计划

一个启用的计划是计划,是符合优化器使用。

在将enabled参数设置为YES(默认)的情况下加载计划时,数据库会自动将生成的SQL计划基线标记为启用,即使它们不被接受也是如此。您可以将已启用的计划手动更改为已禁用的计划,这意味着优化程序即使已接受该计划也无法使用它。

 

27.6.3.2接受的计划

一个公认的计划是一个计划,是在SQL计划基线的SQL语句,因而可用于优化器使用。接受的计划包含一组提示,计划哈希值和其他与计划相关的信息。

语句的SQL计划历史记录包含所有接受和不接受的计划。优化器在计划基线中生成第一个接受的计划后,所有随后的未接受计划都将添加到计划历史记录中,以等待验证,但不在SQL计划基线中。

 

27.6.3.3固定计划

固定的计划是,被标记为优选的一个公认的计划,使得优化器考虑仅在基线固定计划。固定计划会影响优化器的计划选择过程。

假设在一个语句的SQL计划基线中存在三个计划。您希望优化器仅对其中两个计划给予优惠。如下图所示,您将这两个计划标记为固定,以便优化程序仅使用这两个计划中的最佳计划,而忽略其他计划。

图27-6固定计划


如果将新计划添加到包含至少一个已启用的固定计划的基准,则优化器将无法使用新计划,除非您手动将其声明为固定计划。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论