热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle19C关于优化器提示

ORACLE19CSQL调

 

优化程序提示是SQL语句中的特殊注释,这些指令将指令传递给优化程序。

除非受到某些条件的限制,否则优化器会使用提示为语句选择执行计划。

 

 

 3.1关于优化器提示

提示嵌入在SQL注释中。

提示注释必须紧跟在SQL语句块的第一个关键字之后。您可以使用任何一种注释风格:斜杠(/*)或破折号(--)。加号(+)提示定界符必须紧跟在注释定界符之后,且加号前不允许有空格,如以下片段所示:

SELECT /*+ hint_text */ ...

加号后的空格是可选的。语句块只能有一个包含提示的注释,但它可以包含许多以空格分隔的提示。用至少一个空格分隔多个提示,如以下语句所示:

SELECT /*+ FULL (hr_emp) CACHE(hr_emp) */ last_name FROM employees hr_emp;


3.1.1提示的目的

提示使您能够做出优化器通常做出的决策。

您可以使用提示来影响优化器模式,查询转换,访问路径,联接顺序和联接方法。在测试环境中,提示对于测试特定访问路径的性能很有用。例如,您可能知道索引对于某些查询更具选择性,从而导致更好的计划。下图显示了如何使用提示来告诉优化器为特定的语句使用特定的索引。

图19-2优化程序提示


提示的缺点是需要额外的代码来管理,检查和控制。当优化程序生成次优计划时,用户几乎没有追索权时,在Oracle7中引入了提示。因为数据库和主机环境中的更改可能使提示过时或产生负面影响,所以一个好的实践是使用提示进行测试,但使用其他技术来管理执行计划。

Oracle提供了多种工具,包括SQL Tuning Advisor,SQL计划管理和SQL Performance Analyzer,以解决优化程序无法解决的性能问题。Oracle强烈建议您使用这些工具,而不要使用提示,因为它们会随着数据和数据库环境的变化而提供新的解决方案。

父主题: 关于优化器提示


19.3.1.2提示类型

您可以对表,查询块和语句使用提示。

提示分为以下几种类型:

  • 单表

    在一个表或视图上指定单表提示。INDEX并且USE_NL是单表提示的示例。以下语句使用单表提示:

    SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id
    FROM employees
    WHERE department_id > 50;

  • 多表

    多表提示类似于单表提示,不同之处在于该提示可以指定多个表或视图。LEADING是多表提示的示例。以下语句使用多表提示:

    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;

    注意:

    USE_NL(table1 table2)不被认为是多表暗示,因为它是一个快捷方式USE_NL(table1)USE_NL(table2)

  • 查询块

    查询块提示在单个查询块上运行。STAR_TRANSFORMATION并且UNNEST是查询块提示的示例。以下语句使用查询块提示来指定该FULL提示仅适用于引用的查询块employees

    SELECT /*+ INDEX(t1) FULL(@sel$2 t1) */ COUNT(*)
    FROM jobs t1
    WHERE t1.job_id IN (SELECT job_id FROM employees t1);

  • 声明

    语句提示适用于整个SQL语句。ALL_ROWS是语句提示的示例。以下语句使用语句提示:

    SELECT /*+ ALL_ROWS */ * FROM sales;

也可以看看:

《 Oracle数据库SQL语言参考》中按功能类别提供的最常见提示。

 

19.3.1.3提示范围

当您在语句块中指定提示时,该提示将应用于相应的查询块,表或语句块中的整个语句。该提示将覆盖所有实例级或会话级参数

一个语句块是以下情况之一:

  • 一个简单的MERGESELECTINSERTUPDATE,或DELETE语句
  • 父语句或复杂语句的子查询
  • 使用的运算符集合的查询的一部分(UNIONMINUSINTERSECT


示例19-1使用集合运算符的查询

以下查询由两个组件查询和UNION运算符组成:

SELECT /*+ FIRST_ROWS(10) */ prod_id, time_id FROM 2010_sales
UNION ALL
SELECT /*+ ALL_ROWS */ prod_id, time_id FROM current_year_sales;

前面的语句有两个块,每个组件查询一个。第一个组件查询中的提示仅适用于其优化,而不适用于第二个组件查询的优化。例如,在2015年的第一周,您查询当年和去年的销售额。您将应用FIRST_ROWS(10)到去年(2014)的销售ALL_ROWS查询以及对今年(2015)的销售查询提示。


推荐阅读
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
author-avatar
moon2502863581
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有