在数据库优化中,除了针对业务架构、逻辑及sql调整之外,数据库本身也有很多影响优化器的一些技术,主要有数据库参数、sql计划管理器、hint等。 如下图所示:
下面我们具体看下这几个技术
1.初始化参数
控制优化器行为的主要参数为:
初始化参数 | 描述 |
---|---|
CURSOR_INVALIDATION |
为 DDL 语句提供默认的游标失效级别。
您可以在
|
|
将 SQL 语句中的文字值转换为绑定变量。 转换这些值可以改善游标共享,并且会影响 SQL 语句的执行计划。 优化器根据绑定变量的存在而不是实际的文字值生成执行计划。
设置为
|
|
指定在全表扫描或索引快速全扫描期间在单个 I/O 中读取的块数。 优化器使用这个参数的值来计算全表扫描和索引快速全扫描的开销。 较大的值会降低全表扫描的成本,这可能会导致优化器选择全表扫描而不是索引扫描。 此参数的默认值对应于数据库可以有效执行的最大 I/O 大小。 此值取决于平台,对于大多数平台为 1 MB。 因为该参数以块表示,所以它被设置为等于可以有效执行的最大 I/O 大小除以标准块大小的值。 如果会话数非常大,则多块读取计数值会降低,以避免缓冲区缓存被过多的表扫描缓冲区淹没。 |
|
控制适应性计划。 适应性计划有替代选择。 优化器根据在查询执行时收集的统计信息在运行时决定计划。
默认情况下,此参数为
请参阅 “ 关于自适应查询计划 ” 。 |
|
控制自动重新优化和自适应计划的报告模式(请参阅
“
自适应查询计划
”
)。
默认情况下,报告模式为关闭 (
如果设置为
|
|
控制自适应统计。 当查询谓词过于复杂而无法单独依赖基表统计信息时,优化器可以使用自适应统计信息。
默认情况下,
请参阅 “ 自适应统计 ” 。 |
|
在数据库实例启动时设置优化器模式。
可能的值是
|
|
使用嵌套循环控制索引探测的成本分析。
值的范围
|
|
调整索引探测的成本。
该值的范围是
|
|
此参数启用 (
|
|
当
|
OPTIMIZER_SESSION_TYPE |
确定数据库在自动索引验证期间是否验证语句。
默认是
通过
在会话中
设置
|
|
启用或禁用 SQL 隔离配置的自动创建。要启用 SQL 隔离在资源管理器终止查询后自动创建配置,请将
OPTIMIZER_CAPTURE_SQL_QUARANTINE
初始化参数
设置
为
TRUE
(默认为
FALSE
)。 |
|
启用或禁用不可见索引的使用。 |
|
启用或禁用优化器的查询重写功能。
|
|
确定优化器在为 SQL 语句选择执行计划时是否考虑 SQL 隔离配置。
要禁用现有 SQL 隔离配置的使用,请设置
|
|
确定强制执行查询重写的程度。
默认情况下,完整性级别设置为
要在约束处于
|
|
控制数据库是将 SQL 查询结果缓存用于所有查询,还是仅用于使用结果缓存提示注释的查询。
当设置为
设置此参数时,请考虑结果缓存如何处理 PL/SQL 函数。
数据库使用跟踪 PL/SQL 函数的数据依赖性的相同机制使结果缓存中的查询结果无效,但允许缓存包含 PL/SQL 函数的查询。
由于 PL/SQL 函数结果缓存失效不会跟踪所有类型的依赖关系(例如对序列、
|
|
指定结果缓存可以使用的最大 SGA 内存量(以字节为单位)。
缺省是从的值导出
|
|
指定
|
|
指定一个缓存查询可以消耗的临时表空间内存的最大百分比。
默认值为
|
|
指定结果缓存可以在 PDB 中消耗的最大临时表空间内存量。 此参数只能在系统级别修改。
默认值为 的默认值或初始化值的 10 倍
|
|
指定依赖于远程数据库对象的结果保持有效的分钟数。
默认值为
|
|
使优化器能够为星型查询(如果
|
2. 提示
提示主要是在语句上加入相关提示,以强制数据库按照提示方式执行。部分示例如下:
SELECT /*+ FULL (hr_emp) CACHE(hr_emp) */ last_name FROM employees hr_emp; --单表 SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id FROM employees WHERE department_id > 50; --多表 SELECT /*+ LEADING(e j) */ * FROM employees e, departments d, job_history j WHERE e.department_id = d.department_id AND e.hire_date = j.start_date;
3.DBMS_STATS
主要定期收集统计信息,以供Oracle优化器选择最优路径。详细信息,后续博客录入。
4.SQL配置文件
SQL 配置文件是查询的辅助统计信息的集合,包括查询中引用的所有表和列。
配置文件以内部格式存储在数据字典中。用户界面是DBA_SQL_PROFILES字典视图。优化程序在优化期间使用此信息来确定最佳计划。 实现sql配置文件示例:
DECLARE my_sqlprofile_name VARCHAR2(30); BEGIN my_sqlprofile_name := DBMS_SQLTUNE.ACCEPT_SQL_PROFILE ( task_name => 'STA_SPECIFIC_EMP_TASK' , name => 'my_sql_profile' , profile_type => DBMS_SQLTUNE.PX_PROFILE , force_match => true ); END; / --列出已有的配置文件 COLUMN category FORMAT a10 COLUMN sql_text FORMAT a20 SELECT NAME, SQL_TEXT, CATEGORY, STATUS FROM DBA_SQL_PROFILES; --更改配置文件 VARIABLE pname my_sql_profile BEGIN DBMS_SQLTUNE.ALTER_SQL_PROFILE ( name => :pname , attribute_name => 'CATEGORY' , value => 'DEFAULT' ); END; --删除配置文件 BEGIN DBMS_SQLTUNE.DROP_SQL_PROFILE ( name => 'my_sql_profile' ); END; /
5.sql计划管理
SQL 计划管理使用一种称为 SQL 计划基线 的机制 ,这是一组允许优化器用于 SQL 语句的可接受计划。
其主要目的是--SQL 计划管理可防止由计划更改引起的性能回归。
SQL 配置文件和 SQL 计划基线都通过确保优化器仅使用最佳计划来帮助提高 SQL 语句的性能。
配置文件和基线都是使用提示在内部实现的。但是,这些机制存在显着差异,包括:
-
通常,SQL 计划基线是主动的,而 SQL 配置文件是被动的。
-
SQL 计划基线再现特定计划,而 SQL 配置文件则更正优化器成本估算。
也可参考:
http://blog.itpub.net/29487349/viewspace-2765000/
详细情况可参考Oracle官方文档:https://docs.oracle.com/en/database/oracle/oracle-database/21/tgsql/overview-of-sql-plan-management.html#GUID-B51FBAA9-EE95-4F19-AD4B-F5F4C2910688