25.1.2 SQL Access Advisor体系结构
自动调整优化器是SQL Access Advisor使用的中央工具。
顾问程序可以从图25-1所示的源接收SQL语句作为输入,使用优化器分析这些语句,然后提出建议。
图25-1显示了SQL Access Advisor的基本体系结构。
图25-1 SQL Access Advisor架构
本节包含以下主题:
- 向SQL Access Advisor的输入 SQL Access Advisor需要一个工作负载,该工作负载由一个或多个SQL语句以及完全描述每个语句的统计信息和属性组成。
- SQL Access Advisor的筛选器选项 您可以将筛选器应用于工作负载以限制要分析的内容。
- SQL Access Advisor建议 任务建议的范围可以从简单到复杂。
- SQL Access Advisor操作 通常,每个建议都会为一组查询带来好处。
- SQL Access Advisor存储库SQL Access Advisor 所需和生成的信息位于Advisor存储库中,该存储库位于数据字典中。
也可以看看:
“ 关于自动调整优化器 ”
25.1.2.1输入到SQL Access Advisor
SQL Access Advisor需要一个工作负载,该工作负载由一个或多个SQL语句以及完全描述每个语句的统计信息和属性组成。
完整的工作负载包含目标业务应用程序中的所有SQL语句。部分工作负载包含SQL语句的子集。
如图25-1所示,SQL Access Advisor输入可以来自以下来源:
- 共享SQL区
数据库使用共享SQL区域来分析当前位于中的最新SQL语句
V$SQL。 - SQL调整集
甲SQL调整集(STS)是一个数据库对象,其存储SQL与他们的执行上下文沿语句。当一组SQL语句用作输入时,数据库必须首先构造并使用STS。
注意:
为了获得最佳结果,请提供工作负载作为SQL调整集。该
DBMS_SQLTUNE软件包提供了一些帮助程序功能,这些功能可以从常见的工作负载源(例如SQL缓存,表中存储的用户定义的工作负载以及假设的工作负载)创建SQL调整集。 - 假设的工作量
您可以通过分析维度和约束从架构中创建假设的工作负载。最初设计应用程序时,此选项很有用。
也可以看看:
- “ 关于SQL调优集 ”
- Oracle Database Concepts了解共享SQL领域
25.1.2.2 SQL Access Advisor的筛选器选项
您可以将过滤器应用于工作负载以限制要分析的内容。
例如,指定顾问基于优化程序成本仅查看工作负载中最耗费资源的30条语句。此限制可以根据不同的工作负载方案生成不同的建议集。
SQL Access Advisor参数控制推荐过程和工作负载的自定义。这些参数控制过程的各个方面,例如所需推荐的类型和所推荐内容的命名约定。
要设置这些参数,请使用以下DBMS_ADVISOR.SET_TASK_PARAMETER步骤。参数是持久的,因为它们在任务的生命周期内保持设置状态。使用设置参数值后DBMS_ADVISOR.SET_TASK_PARAMETER,直到再次调用此过程,该值才会更改。
也可以看看:
Oracle Database PL / SQL软件包和类型参考以了解该DBMS_ADVISOR.SET_TASK_PARAMETER过程
25.1.2.3 SQL Access Advisor建议
任务建议的范围可以从简单到复杂。
顾问程序可以建议您创建数据库对象,例如:
- 指标
SQL Access Advisor索引建议包括位图,基于函数的索引和B树索引。与其他索引技术相比,位图索引可缩短许多类型的即席查询的响应时间,并减少存储需求。B树索引最常用于数据仓库中,以索引唯一或接近唯一的键。SQL Access Advisor实例化视图建议包括快速可刷新和完全可刷新的实例化视图,用于常规重写或精确文本匹配重写。
- 物化视图
SQL Access Advisor使用该
TUNE_MVIEW过程还建议如何优化实例化视图,以便它们可以快速刷新并利用常规查询重写的优势。 - 物化视图日志
实例化视图日志是实例化视图的主站点或主实例化视图站点上的表,该表将所有DML更改记录到主表或主实例化视图。仅当实例化视图的主数据库具有实例化视图日志时,才可以快速刷新实例化视图。
- 隔断
SQL Access Advisor可以建议对现有未分区基表进行分区以提高性能。此外,它可能会建议自己进行分区的新索引和实例化视图。
虽然创建新的分区索引和实例化视图与未分区的情况没有什么不同,但是请小心地对现有的基表进行分区。当在表上定义索引,视图,约束或触发器时,尤其如此。
为了提出建议,SQL Access Advisor依赖于有关维度级别列,JOIN KEY列和事实表键列的表和索引基数的结构统计信息。您可以使用DBMS_STATS软件包收集准确或估计的统计信息 。
由于收集统计信息非常耗时,并且不需要完全的统计准确性,因此通常最好估算统计信息。如果不收集指定表上的统计信息,则引用该表的查询在工作负载中被标记为无效,因此没有针对这些查询的建议。还建议对所有现有索引和实例化视图进行分析。
也可以看看:
- “ 关于使用DBMS_STATS进行手动统计信息收集 ”
- 《 Oracle数据库数据仓库指南》以了解有关实例化视图的更多信息
- Oracle Database VLDB和分区指南,以了解有关分区的更多信息
25.1.2.4 SQL Access Advisor操作
通常,每个建议都会为一组查询带来好处。
建议中的所有单独操作都必须一起执行以实现全部收益。建议可以共享行动。
例如,一条CREATE INDEX语句可以为多个查询带来好处,但是某些查询可能会从一条附加的CREATE MATERIALIZED VIEW语句中受益。在这种情况下,顾问程序将生成两项建议:一项针对仅需要索引的查询集,另一项针对需要索引和物化视图的查询集。
本节包含以下主题:
25.1.2.4.1动作类型
SQL Access Advisor提出几种不同类型的建议。
建议包括以下类型的操作:
PARTITION BASE TABLE此操作对现有的未分区基表进行分区。
CREATE|DROP|RETAIN {MATERIALIZED VIEW|MATERIALIZED VIEW LOG|INDEX}这些
CREATE动作对应于新的访问结构。RETAIN建议保留现有的访问结构。仅DROP当WORKLOAD_SCOPE参数设置为时,SQL Access Advisor才建议使用FULL。GATHER STATS此操作将生成对
DBMS_STATS过程的调用,以收集有关新生成的访问结构的统计信息。
多个建议可能引用同一操作。但是,在为建议生成脚本时,每个动作只能看到一次。
也可以看看:
- “ 关于使用DBMS_STATS进行手动统计信息收集 ”
- “ 查看SQL Access Advisor任务结果 ”以了解如何查看操作和建议
25.1.2.4.2解释分区建议的准则
当SQL Access Advisor确定对基表进行分区可以提高性能时,该顾问会将分区操作添加到每个包含引用该表的查询的建议中。这样,就可以在正确分区的表上实现索引和实例化视图建议。
SQL Access Advisor可能建议对现有的未分区基表进行分区。当顾问程序实施脚本包含分区建议时,请注意以下问题:
- 对现有表进行分区是一项复杂而广泛的操作,与实施新索引或实例化视图相比,可能需要更长的时间。应该保留足够的时间来实施此建议。
- 尽管通过删除索引或视图很容易撤消索引和物化视图建议,但是将表分区后,就不能轻易将其还原到其原始状态。因此,请确保在执行包含分区建议的脚本之前备份数据库。
- 重新分区基本表时,SQL Access Advisor脚本会创建原始表的临时副本,该副本与原始表占用相同的空间。因此,重新分区过程要求有足够的可用磁盘空间用于要分区的最大表的另一个副本。在运行实施脚本之前,请确保该空间可用。
分区实现脚本尝试迁移依赖对象,例如索引,实例化视图和约束。但是,某些对象无法自动迁移。例如,针对重新分区的基表定义的PL / SQL存储过程通常会变得无效,必须重新编译。
- 如果决定不实施分区建议,则同一脚本中同一表上的所有其他建议(例如
CREATE INDEX和CREATE MATERIALIZED VIEW推荐)都取决于分区建议。要获得准确的建议,请勿简单地从脚本中删除分区建议。而是在禁用分区的情况下重新运行顾问程序,例如,通过将parameter设置ANALYSIS_SCOPE为不包含关键字的值TABLE。
也可以看看:
- Oracle Database SQL语言参考中的
CREATE DIRECTORY语法 - 《 Oracle数据库PL / SQL软件包和类型参考》以获取有关该
DBMS_ADVISOR.GET_TASK_SCRIPT功能的 详细信息
25.1.2.5 SQL Access Advisor存储库
SQL Access Advisor所需和生成的信息驻留在Advisor存储库中,该存储库位于数据字典中。
SQL Access Advisor存储库具有以下优点:
- 收集SQL Access Advisor的完整工作负载
- 支持历史数据
- 由数据库管理




