ORACLE官方SQL语言参考笔记之Oracle SQL的基本元素篇(第三章-第六节-注释)

本文简述

此书下载方法:加入群技术交流群(免费)699712384,文件夹为ORACLE官方文档中 
CSDN技术网址 
简书技术网址 
ORACLE官网教程地址 
书名:

中文名:《SQL语言参考笔记》

英文名:《SQL Language Reference》

作者:二次猿

时间:阅读于2018年3月21日

准备工作:详情见:具体可以参考简书和二次猿公众号常用表

注意事项:跳过基本概念和非重要内容,重点举例说明,并且加粗,部分内容可能在其他章节会再次详细介绍,表格如果排版不美观,可以复制到excle进行直观展示,代码部分根据实际情况注释和说明


注释

您可以创建两种类型的注释:

  • sql 语句中的注释存储为执行 SQL 语句的应用程序代码的一部分。

  • 与单个架构或 nonschema 对象关联的注释与对象本身的元数据一起存储在数据字典中。

SQL 语句中的注释

注释可以使您的应用程序更易于阅读和维护。例如, 可以在描述应用程序内语句用途的语句中包含注释。除了提示之外, SQL 语句中的注释不会影响语句的执行。有关使用此特定批注形式的"提示" , 请参阅。

注释可以出现在语句中的任何关键字、参数或标点符号之间。可以通过两种方式在语句中包含注释:

  • 用斜线和星号 (/*) 开始注释。继续进行注释的文本。此文本可以跨越多行。用星号和斜线 (*/) 结束注释。开头和结尾字符不需要用空格或行符与文本隔开。

  • 用-(两个连字符) 开始注释。继续进行注释的文本。此文本不能扩展到新行。用行符结束注释。

用于输入 SQL 的一些工具有其他限制。例如, 如果使用的是 SQL 加号, 则默认情况下, 在多行注释中不能有空行。有关详细信息, 请参阅用作数据库接口的工具的文档。

SQL 语句可以包含两种样式的多个注释。注释的文本可以包含数据库字符集中的任何可打印字符。

例子这些语句包含许多注释:

SELECT last_name, employee_id, salary + NVL(commission_pct, 0), 
       job_id, e.department_id
  /* Select all employees whose compensation is
  greater than that of Pataballa.*/
  FROM employees e, departments d
  /*The DEPARTMENTS table is used to get the department name.*/
  WHERE e.department_id = d.department_id
    AND salary + NVL(commission_pct,0) >   /* Subquery:       */
      (SELECT salary + NVL(commission_pct,0)
        /* total compensation is salary + commission_pct */
        FROM employees 
        WHERE last_name = 'Pataballa')
  ORDER BY last_name, employee_id;

SELECT last_name,                                   -- select the name
       employee_id                                  -- employee id
       salary + NVL(commission_pct, 0),             -- total compensation
       job_id,                                      -- job
       e.department_id                              -- and department
  FROM employees e,                                 -- of all employees
       departments d
  WHERE e.department_id = d.department_id
    AND salary + NVL(commission_pct, 0) >           -- whose compensation 
                                                    -- is greater than
        (SELECT salary + NVL(commission_pct,0)      -- the compensation
          FROM employees 
          WHERE last_name = 'Pataballa')            -- of Pataballa
  ORDER BY last_name                                -- and order by last name
           employee_id                              -- and employee id.
;

对架构和 Nonschema 对象的注释

使用COMMENT命令, 可以使用COMMENT命令将注释与架构对象 (表、视图、实例化视图、运算符、indextype、挖掘模型) 或 nonschema 对象 (版本) 关联。还可以在列 (作为表架构对象的一部分) 上创建注释。与架构和 nonschema 对象关联的注释存储在数据字典中。有关此注释形式的说明, 请参阅注释

提示

提示是 SQL 语句中的注释, 它将指令传递给 Oracle 数据库优化器。优化器使用这些提示为语句选择执行计划, 除非存在阻止优化程序进行此操作的某些条件。

在 Oracle7 中引入了提示, 当用户在优化器生成了不理想的计划时几乎没有追索权。现在, Oracle 提供了许多工具, 包括 sql 优化顾问、sql 计划管理和 sql 性能分析器, 以帮助您解决优化程序未解决的性能问题。Oracle 强烈建议您使用这些工具而不是提示。这些工具远远优于提示, 因为在持续使用的基础上, 它们提供了新的解决方案, 如数据和数据库环境的变化。

应谨慎使用提示, 并且只有在收集有关表的统计信息并在没有提示的情况下使用 "EXPLAIN PLAN" 语句评估优化程序计划后, 才应加以利用。在后续版本中更改数据库条件以及查询性能增强可能会对代码中的提示如何影响性能产生重大影响。

本节的其余部分提供有关常用提示的信息。如果您决定使用提示而不是更高级的优化工具, 请注意, 由于使用提示而产生的任何短期利益可能不会继续导致长期的性能改善。

使用提示

语句块只能有一个包含提示的注释, 并且该注释必须遵循SELECT、 UPDATEINSERTMERGEDELETE关键字。

下面的语法图显示了 Oracle 在语句块中支持的两种注释样式中包含的提示。提示语法必须紧跟在INSERT、 UPDATEDELETESELECTMERGE关键字之后, 开始语句块。

提示::=

Description of hint.gif follows
插图 "提示 gif" 的说明

地方:

  • 加号 (+) 使 Oracle 将注释解释为提示列表。加号必须紧跟在注释分隔符之后。不允许使用空间。

  • hint是本节中讨论的提示之一。加号和提示之间的空间是可选的。如果注释包含多个提示, 则至少用一个空格分隔提示。

  • string是可与提示散置的其他注释文本。

--+语法要求整个注释都在一行上。

Oracle 数据库忽略提示, 并且在下列情况下不会返回错误:

  • 提示中包含拼写错误或语法误差。但是, 数据库确实在同一注释中考虑其他正确指定的提示。

  • 包含提示的注释不跟随DELETEINSERTMERGESELECTUPDATE关键字。

  • 提示的组合相互冲突。但是, 数据库确实在同一注释中考虑其他提示。

  • 数据库环境使用 PL/SQL 1 版, 如窗体版本3触发器、oracle 窗体4.5 和 oracle 报告2.5。

  • 全局提示指的是多个查询块。有关详细信息, 请参阅"在全局提示中指定多个查询块" 。

在提示中指定查询块

可以在许多提示中指定可选的查询块名称, 以指定提示应用到的查询块。此语法允许在外部查询中指定应用于内联视图的提示。

查询块参数的语法是窗体@queryblock, 其中queryblock是指定查询中的查询块的标识符。queryblock标识符可以是系统生成的或用户指定的。当在查询块中指定提示所应用的提示时, 将省略@queryblock语法。

  • 可以使用查询的EXPLAINPLAN获取系统生成的标识符。投影查询块名称可以通过使用NO_QUERY_TRANSFORMATION提示为查询运行EXPLAINPLAN来确定。请参见"NO_QUERY_TRANSFORMATION 提示".

  • 可以使用QB_NAME提示设置用户指定的名称。请参见"QB_NAME 提示".

指定全局提示

许多提示可以同时应用于特定的表或索引, 更适用于全局地对视图中的表或作为索引的一部分的列。语法元素tablespecindexspec定义这些全局提示.

tablespec::=

Description of tablespec.gif follows
插图 "tablespec" 的说明

必须指定要访问的表与语句中显示的完全相同。如果语句使用表的别名, 则在提示中使用别名而不是表名。但是, 即使架构名称出现在语句中, 也不要在提示中包含带有表名的架构名称。

注意:

使用tablespec子句指定全局提示不适用于使用 ANSI 联接的查询, 因为优化程序在分析期间生成其他视图。 而是指定@queryblock以指示提示应用到的查询块。

indexspec::=

Description of indexspec.gif follows
插图 "indexspec" 的说明

tablespec后面跟着indexspec在提示的规范中, 允许用逗号分隔表名和索引名, 但不需要。还允许 (但不是必需) 使用逗号分隔indexspec的多个匹配项.

在全局提示中指定多个查询块

Oracle 数据库忽略引用多个查询块的全局提示。为避免此问题, Oracle 建议您在提示中指定对象别名, 而不是使用tablespecindexspec.

例如, 请考虑以下视图v和表t:

CREATE VIEW v AS
  SELECT e.last_name, e.department_id, d.location_id
  FROM employees e, departments d
  WHERE e.department_id = d.department_id;
 
CREATE TABLE t AS
  SELECT * from employees
  WHERE employee_id < 200;

注意:

下面的示例使用EXPLAINPLAN语句, 它使您可以显示执行计划并确定提示是被尊重还是被忽略。 有关详细信息, 请参阅解释计划

在下面的查询中忽略LEADING提示, 因为它引用多个查询块, 即包含表t的主查询块和视图查询块v:

EXPLAIN PLAN
  SET STATEMENT_ID = 'Test 1'
  INTO plan_table FOR
    (SELECT /*+ LEADING(v.e v.d t) */ *
     FROM t, v
     WHERE t.department_id = v.department_id);

下面的SELECT语句返回执行计划, 它显示LEADING提示被忽略:

SELECT id, LPAD(' ',2*(LEVEL-1))||operation operation, options, object_name,  object_alias
  FROM plan_table
  START WITH id = 0 AND statement_id = 'Test 1'
  CONNECT BY PRIOR id = parent_id AND statement_id = 'Test 1'
  ORDER BY id;

 ID OPERATION            OPTIONS    OBJECT_NAME   OBJECT_ALIAS
--- -------------------- ---------- ------------- --------------------
  0 SELECT STATEMENT
  1   HASH JOIN
  2     HASH JOIN
  3       TABLE ACCESS   FULL       DEPARTMENTS   D@SEL$2
  4       TABLE ACCESS   FULL       EMPLOYEES     E@SEL$2
  5     TABLE ACCESS     FULL       T             T@SEL$1

在下面的查询中,LEADING提示是值得尊敬的, 因为它引用的是对象别名, 可以在上一个查询返回的执行计划中找到它:

EXPLAIN PLAN
  SET STATEMENT_ID = 'Test 2'
  INTO plan_table FOR
    (SELECT /*+ LEADING(E@SEL$2 D@SEL$2 T@SEL$1) */ *
     FROM t, v
     WHERE t.department_id = v.department_id);

下面的SELECT语句返回执行计划, 这表明LEADING提示是被授予的:

SELECT id, LPAD(' ',2*(LEVEL-1))||operation operation, options,
  object_name, object_alias
  FROM plan_table
  START WITH id = 0 AND statement_id = 'Test 2'
  CONNECT BY PRIOR id = parent_id AND statement_id = 'Test 2'
  ORDER BY id;

 ID OPERATION            OPTIONS    OBJECT_NAME   OBJECT_ALIAS
--- -------------------- ---------- ------------- --------------------
  0 SELECT STATEMENT
  1   HASH JOIN
  2     HASH JOIN
  3       TABLE ACCESS   FULL       EMPLOYEES     E@SEL$2
  4       TABLE ACCESS   FULL       DEPARTMENTS   D@SEL$2
  5     TABLE ACCESS     FULL       T             T@SEL$1

另请参见:

Oracle 数据库性能优化指南中有关下列主题的信息:
  • 何时使用全局提示以及 Oracle 如何解释它们

  • 使用EXPLAINPLAN了解优化程序如何执行查询

  • 视图中表的提示中的引用

功能类别提示

表 3-21按功能类别列出提示, 并包含对每个提示的语法和语义的交叉引用。表中的提示按字母顺序引用。

表3-21 按功能类别分列的提示

提示 链接到语法和语义

优化目标和方法

ALL_ROWS 提示

FIRST_ROWS 提示

访问路径提示

群集提示

--

完整提示

--

哈希提示

--

索引提示

NO_INDEX 提示

--

INDEX_ASC 提示

INDEX_DESC 提示

--

INDEX_COMBINE 提示

--

INDEX_JOIN 提示

--

INDEX_FFS 提示

--

INDEX_SS 提示

--

INDEX_SS_ASC 提示

--

INDEX_SS_DESC 提示

--

NATIVE_FULL_OUTER_JOIN 提示

NO_NATIVE_FULL_OUTER_JOIN 提示

--

NO_INDEX_FFS 提示

--

NO_INDEX_SS 提示

联接顺序提示

订购提示

--

领导提示

联接操作提示

USE_HASH 提示

NO_USE_HASH 提示

--

USE_MERGE 提示

NO_USE_MERGE 提示

--

USE_NL 提示

USE_NL_WITH_INDEX 提示

NO_USE_NL 提示

并行执行提示

并行提示

NO_PARALLEL 提示

--

PARALLEL_INDEX 提示

NO_PARALLEL_INDEX 提示

--

PQ_DISTRIBUTE 提示

在线应用程序升级提示

CHANGE_DUPKEY_ERROR_INDEX 提示

--

IGNORE_ROW_ON_DUPKEY_INDEX 提示

--

RETRY_ON_ROW_CHANGE 提示

查询转换提示

事实提示

NO_FACT 提示

--

合并提示

NO_MERGE 提示

--

NO_EXPAND 提示

USE_CONCAT 提示

--

改写提示

NO_REWRITE 提示

--

UNNEST 提示

NO_UNNEST 提示

--

STAR_TRANSFORMATION 提示

NO_STAR_TRANSFORMATION 提示

--

NO_QUERY_TRANSFORMATION 提示

XML 提示

NO_XMLINDEX_REWRITE 提示

--

NO_XML_QUERY_REWRITE 提示

其他提示

追加提示

APPEND_VALUES 提示

NOAPPEND 提示

--

缓存提示

非缓存提示

--

CURSOR_SHARING_EXACT 提示

--

DRIVING_SITE 提示

--

DYNAMIC_SAMPLING 提示

--

MODEL_MIN_ANALYSIS 提示

--

监视器提示

--

NO_MONITOR 提示

--

OPT_PARAM 提示

--

PUSH_PRED 提示

NO_PUSH_PRED 提示

--

PUSH_SUBQ 提示

NO_PUSH_SUBQ 提示

--

PX_JOIN_FILTER 提示

NO_PX_JOIN_FILTER 提示

--

QB_NAME 提示

--

RESULT_CACHE 提示

NO_RESULT_CACHE 提示


按字母顺序列出提示

本节为所有提示按字母顺序提供语法和语义。

ALL_ROWS 提示

Description of all_rows_hint.gif follows
插图 "all_rows_hint" 的说明

ALL_ROWS提示指示优化器优化语句块, 目标是最佳吞吐量, 这是最小的总资源消耗。例如, 优化器使用查询优化方法优化此语句以实现最佳吞吐量:

SELECT /*+ ALL_ROWS */ employee_id, last_name, salary, job_id
  FROM employees
  WHERE employee_id = 107;

如果在 SQL 语句中指定ALL_ROWSFIRST_ROWS提示, 并且如果数据字典没有有关语句访问的表的统计信息, 则优化器将使用默认的统计值, 如分配的存储此类表, 估计丢失的统计信息并随后选择执行计划。这些估计值可能不像DBMS_STATS包收集的那样准确, 因此您应该使用DBMS_STATS包来收集统计信息。

如果您为访问路径或联接操作指定提示, 以及ALL_ROWSFIRST_ROWS提示, 则优化程序将优先于提示指定的访问路径和联接操作。

追加提示

Description of append_hint.gif follows
插图 "append_hint" 的说明

APPEND提示指示优化程序将直接路径INSERTINSERT语句的子查询语法一起使用。

  • 常规INSERT是串行模式下的默认值。在串行模式下, 只有在包含APPEND提示时才能使用直接路径。

  • 直接路径INSERT是并行模式下的默认设置。在并行模式下, 只有在指定NOAPPEND提示时才能使用常规插入。

INSERT是否并行的决定是否与APPEND提示无关。

在直接路径INSERT中, 数据追加到表的末尾, 而不是使用当前分配给表的现有空间。因此, 直接路径INSERT的速度可能比常规INSERT快得多。.

只有INSERT语句的子查询语法 (而不是VALUES子句) 支持APPEND提示。如果您使用VALUES子句指定APPEND提示, 则会忽略它, 并使用常规插入。要使用带有VALUES子句的直接路径INSERT , 请参阅"APPEND_VALUES 提示".

另请参见:

"NOAPPEND 提示" , 了解有关该提示和 Oracle 数据库管理员指南的有关直接路径插入信息的信息

APPEND_VALUES 提示

Description of append_values_hint.gif follows
插图 "append_values_hint" 的说明

APPEND_VALUES提示指示优化器使用VALUES子句的直接路径INSERT如果未指定此提示, 则使用常规INSERT 。

在直接路径INSERT中, 数据追加到表的末尾, 而不是使用当前分配给表的现有空间。因此, 直接路径INSERT的速度可能比常规INSERT快得多。.

APPEND_VALUES提示可用于大大提高性能。其用途的一些例子是:

  • 在 Oracle 调用接口 (保监) 程序中, 当使用大数组绑定或数组绑定行回调时

  • 在 PL/SQL 中, 当加载大量具有带有VALUES子句的INSERT语句的FORALL循环的行时

只有INSERT语句的VALUES子句支持APPEND_VALUES提示。如果使用INSERT语句的子查询语法指定了APPEND_VALUES提示, 则会忽略它, 并使用常规插入。若要使用指向子查询的直接路径INSERT , 请参阅"追加提示".

另请参见:

Oracle 数据库管理员指南以了解有关直接路径插入的信息

缓存提示

Description of cache_hint.gif follows
插图 "cache_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

CACHE提示指示优化器在执行完整表扫描时, 在缓冲区缓存中最近使用的 LRU 列表的末尾处为表检索块。此提示对于小型查找表很有用。

在下面的示例中, CACHE提示将覆盖表的默认缓存规范:

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

CACHENOCACHE缓存提示会影响系统统计table scans (long tables)) 和table scans (short tables)), 如V$SYSSTAT SYSSTAT 数据字典视图所示。

CHANGE_DUPKEY_ERROR_INDEX 提示

Description of change_dupkey_error_index.gif follows
插图 "change_dupkey_error_index" 的说明

注意:

CHANGE_DUPKEY_ERROR_INDEX、 IGNORE_ROW_ON_DUPKEY_INDEXRETRY_ON_ROW_CHANGE提示与其他提示不同, 因为它们具有语义效果。 "提示"中解释的一般哲学不适用于这三提示。

CHANGE_DUPKEY_ERROR_INDEX提示提供了一种机制, 用于明确标识指定列集或指定索引的唯一键冲突。当指定索引发生唯一键冲突时, 将报告 ORA-38911 错误, 而不是 ORA-001。

此提示适用于INSERT、 UPDATE操作。如果指定索引, 则索引必须存在并且是唯一的。如果指定列列表而不是索引, 则该唯一索引的列与指定列的编号和顺序匹配必须存在。

如果违反了特定规则, 此提示的使用将导致错误信息。有关详细信息, 请参阅IGNORE_ROW_ON_DUPKEY_INDEX 提示

注意:

此提示同时禁用APPEND模式和并行 DML。

另请参见:

IGNORE_ROW_ON_DUPKEY_INDEX 提示有关该提示和 Oracle 数据库性能调整指南的信息, 有关使用联机应用程序升级相关提示的详细信息

群集提示

Description of cluster_hint.gif follows
插图 "cluster_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

CLUSTER提示指示优化器使用群集扫描访问指定的表。此提示仅适用于索引群集中的表。

CURSOR_SHARING_EXACT 提示

Description of cursor_sharing_exact_hint.gif follows
插图 "cursor_sharing_exact_hint" 的说明

如果使用绑定变量, Oracle 可以在 SQL 语句中替换文本, 这样做是安全的。此替换由CURSOR_SHARING初始化参数控制。CURSOR_SHARING_EXACT提示指示优化器切换此行为。指定此提示时, Oracle 将执行 SQL 语句, 而不尝试用绑定变量替换文本。

DRIVING_SITE 提示

Description of driving_site_hint.gif follows
插图 "driving_site_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

DRIVING_SITE提示指示优化程序在与数据库所选的不同站点上执行查询。如果使用分布式查询优化, 此提示很有用。

例如:

SELECT /*+ DRIVING_SITE(departments) */ * 
  FROM employees, departments@rsite 
  WHERE employees.department_id = departments.department_id;

如果在没有提示的情况下执行此查询, 则从departments中的行发送到本地站点, 并在那里执行联接。通过提示,employees中的行被发送到远程站点, 并且在那里执行查询, 结果集返回到本地站点。

DYNAMIC_SAMPLING 提示

Description of dynamic_sampling_hint.gif follows
插图 "dynamic_sampling_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

DYNAMIC_SAMPLING提示指示优化器如何通过确定更准确的谓词选择性和表和索引的统计信息来控制动态采样以提高服务器性能。

可以将DYNAMIC_SAMPLING的值设置为从0到10的值。级别越高, 编译器投入动态采样的工作量越大, 应用的范围就越广。除非指定tablespec , 否则取样默认值为游标级别.

integer值为010,表示取样的程度。

如果表的基数统计信息已经存在, 则优化器将使用它。否则, 优化器将启用动态采样来估计基数统计。

如果指定了tablespec并且基数统计信息已经存在, 则:

  • 如果没有单表谓词 (仅计算一个表的WHERE子句), 则优化程序将信任现有的统计信息并忽略此提示。例如, 如果分析employees, 以下查询将不会导致任何动态采样:

    SELECT /*+ DYNAMIC_SAMPLING(e 1) */ count(*)
      FROM employees e;
    
  • 如果存在单表谓词, 则优化器将使用现有的基数统计信息, 并使用现有的统计信息估计谓词的选择性。

要对特定表应用动态采样, 请使用以下提示形式:

SELECT /*+ DYNAMIC_SAMPLING(employees 1) */ *
  FROM employees 
  WHERE ...

另请参见:

Oracle 数据库性能调整指南有关动态采样和可设置的取样级别的信息

事实提示

Description of fact_hint.gif follows
插图 "fact_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

在星型转换的上下文中使用FACT提示。它指示优化程序应将tablespec中指定的表视为事实数据表。

FIRST_ROWS 提示

Description of first_rows_hint.gif follows
插图 "first_rows_hint" 的说明

FIRST_ROWS提示指示 Oracle 优化单个 SQL 语句以快速响应, 选择最有效地返回第一个n行的计划。对于integer, 指定要返回的行数。

例如, 优化器使用查询优化方法优化以下语句以实现最佳响应时间:

SELECT /*+ FIRST_ROWS(10) */ employee_id, last_name, salary, job_id
  FROM employees
  WHERE department_id = 20;

在此示例中, 每个部门都包含许多员工。用户希望部门20的前10名员工尽可能快地显示出来。

优化程序在DELETEUPDATE语句块以及SELECT语句块中忽略此提示, 其中包括任何阻止操作 (如排序或分组)。无法为最佳响应时间优化此类语句, 因为 Oracle 数据库必须检索语句访问的所有行, 然后再返回第一行。如果在任何此类语句中指定了此提示, 则数据库将优化以得到最佳吞吐量。

另请参见:

"ALL_ROWS 提示" , 以了解有关FIRST_ROWS提示和统计信息的其他内容

完整提示

Description of full_hint.gif follows
插图 "full_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

FULL提示指示优化器对指定表执行完整的表扫描。例如:

SELECT /*+ FULL(e) */ employee_id, last_name
  FROM hr.employees e 
  WHERE last_name LIKE :b1;

Oracle 数据库在employees表上执行完整的表扫描以执行此语句, 即使在WHERE子句中的条件提供的last_name列上有索引。

employees表在FROM子句中具有别名e , 因此提示必须引用表的别名而不是其名称。即使在FROM子句中指定了它们, 也不要在提示中指定架构名称。

哈希提示

Description of hash_hint.gif follows
插图 "hash_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

HASH提示指示优化器使用哈希扫描访问指定的表。此提示仅适用于哈希群集中的表。

IGNORE_ROW_ON_DUPKEY_INDEX 提示

Description of ignore_row_on_dupkey_index.gif follows
插图 "ignore_row_on_dupkey_index" 的说明

注意:

CHANGE_DUPKEY_ERROR_INDEX、 IGNORE_ROW_ON_DUPKEY_INDEXRETRY_ON_ROW_CHANGE提示与其他提示不同, 因为它们具有语义效果。 "提示"中解释的一般哲学不适用于这三提示。

IGNORE_ROW_ON_DUPKEY_INDEX提示仅适用于单表INSERT操作。UPDATEDELETEMERGE或多表插入操作不支持该方法。IGNORE_ROW_ON_DUPKEY_INDEX使语句忽略指定列集或指定索引的唯一键冲突。遇到唯一的键冲突时, 将发生行级回滚, 并在下一个输入行中继续执行。如果在启用 DML 错误日志记录的情况下插入数据时指定了此提示, 则不会记录唯一的键冲突, 也不会导致语句终止。

如果违反了特定规则, 此提示的语义效果将导致错误消息:

  • 如果指定index, 则索引必须存在并且是唯一的。否则, 该语句将导致 ORA-38913。

  • 必须精确指定一个索引。如果不指定索引, 则语句会导致 ORA-38912。如果指定多个索引, 则语句会导致 ORA-38915。

  • 您可以在INSERT语句中指定CHANGE_DUPKEY_ERROR_INDEXIGNORE_ROW_ON_DUPKEY_INDEX提示, 但不能在两者中都定义。如果同时指定两者, 则语句会导致 ORA-38915。

与所有提示一样, 提示中的语法错误会导致它被静默忽略。结果将会导致 ORA-00001, 就好像没有使用任何提示一样。

注意:

此提示同时禁用APPEND模式和并行DML.

另请参见:

CHANGE_DUPKEY_ERROR_INDEX 提示有关该提示和 Oracle 数据库性能调整指南的信息, 有关使用联机应用程序升级相关提示的详细信息

索引提示

Description of index_hint.gif follows
插图 "index_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX提示指示优化器对指定表使用索引扫描。可以对基于函数的、域、B 树、位图和位图联接索引使用INDEX提示。

提示的行为取决于indexspec规范:

  • 如果INDEX提示指定了单个可用索引, 则数据库将对此索引执行扫描。优化程序不考虑对表进行完整的表扫描或扫描其他索引。

  • 对于多个索引组合的提示, Oracle 建议使用INDEX_COMBINE而不是INDEX, 因为它是一个更通用的提示。如果INDEX提示指定了可用索引的列表, 则优化程序将考虑对列表中每个索引的扫描成本, 然后以最低的成本执行索引扫描。如果此类访问路径的开销最低, 则数据库还可以选择从该列表中扫描多个索引并合并结果。数据库不考虑对提示中未列出的索引进行完整的表扫描或扫描。

  • 如果INDEX提示未指定索引, 则优化程序将考虑对表上每个可用索引的扫描成本, 然后以最低的成本执行索引扫描。如果此类访问路径的开销最低, 则数据库还可以选择扫描多个索引并合并结果。优化程序不考虑完整的表扫描。

例如:

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

INDEX_ASC 提示

Description of index_asc_hint.gif follows
插图 "index_asc_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_ASC提示指示优化器对指定表使用索引扫描。如果语句使用索引范围扫描, 则 Oracle 数据库将按索引值的升序扫描索引项。每个参数的作用与"索引提示"中的目的相同。.

范围扫描的默认行为是按索引值的升序顺序扫描索引项, 或按降序索引的降序进行。此提示不会更改索引的默认顺序, 因此不指定超过INDEX提示的任何内容。但是, 可以使用INDEX_ASC提示在默认行为发生更改时显式指定提升范围扫描。

INDEX_COMBINE 提示

Description of index_combine_hint.gif follows
插图 "index_combine_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_COMBINE提示指示优化器使用表的位图访问路径。如果从INDEX_COMBINE提示中省略了indexspec , 则优化器将使用索引的任何布尔组合都具有该表的最佳成本估计值。如果指定indexspec, 则优化程序将尝试使用指定索引的某些布尔组合。每个参数的作用与"索引提示"中的目的相同。例如:

SELECT /*+ INDEX_COMBINE(e emp_manager_ix emp_department_ix) */ *
  FROM employees e
  WHERE manager_id = 108
     OR department_id = 110;

INDEX_DESC 提示

Description of index_desc_hint.gif follows
插图 "index_desc_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_DESC提示指示优化器对指定表使用降序索引扫描。如果语句使用索引范围扫描并且索引为升序, 则 Oracle 按其索引值的降序扫描索引项。在分区索引中, 结果在每个分区中按降序排列。对于降序索引, 此提示有效地取消了降序, 从而使索引项按升序进行扫描。每个参数的作用与"索引提示"中的目的相同。例如:

SELECT /*+ INDEX_DESC(e emp_name_ix) */ *
  FROM employees e;

另请参见:

Oracle 数据库性能调整指南以了解完整扫描的信息

INDEX_FFS 提示

Description of index_ffs_hint.gif follows
插图 "index_ffs_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_FFS提示指示优化器执行快速完整索引扫描, 而不是完整的表扫描。

每个参数的作用与"索引提示"中的目的相同。例如:

SELECT /*+ INDEX_FFS(e emp_name_ix) */ first_name
  FROM employees e;

INDEX_JOIN 提示

Description of index_join_hint.gif follows
插图 "index_join_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_JOIN提示指示优化器将索引联接用作访问路径。为使提示具有积极效果, 必须存在足够少的索引, 其中包含解析查询所需的所有列。

每个参数的作用与"索引提示"中的目的相同。例如, 下面的查询使用索引联接来访问manager_iddepartment_id列, 它们都在employees表中进行索引。

SELECT /*+ INDEX_JOIN(e emp_manager_ix emp_department_ix) */ department_id
  FROM employees e
  WHERE manager_id < 110
    AND department_id < 50;

INDEX_SS 提示

Description of index_ss_hint.gif follows
插图 "index_ss_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_SS提示指示优化器对指定表执行索引跳过扫描。如果语句使用索引范围扫描, 则 Oracle 将按索引值的升序扫描索引项。在分区索引中, 结果按每个分区中的升序排列。

每个参数的作用与"索引提示"中的目的相同。例如:

SELECT /*+ INDEX_SS(e emp_name_ix) */ last_name
  FROM employees e
  WHERE first_name = 'Steven';

另请参见:

Oracle 数据库性能调整指南有关索引跳过扫描的信息

INDEX_SS_ASC 提示

Description of index_ss_asc_hint.gif follows
插图 "index_ss_asc_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_SS_ASC提示指示优化器对指定表执行索引跳过扫描。如果语句使用索引范围扫描, 则 Oracle 数据库将按索引值的升序扫描索引项。在分区索引中, 结果按每个分区中的升序排列。每个参数的作用与"索引提示"中的目的相同。.

范围扫描的默认行为是按索引值的升序顺序扫描索引项, 或按降序索引的降序进行。此提示不会更改索引的默认顺序, 因此不指定超过INDEX_SS提示的任何内容。但是, 可以使用INDEX_SS_ASC提示在默认行为更改时显式指定提升范围扫描。

另请参见:

Oracle 数据库性能调整指南有关索引跳过扫描的信息

INDEX_SS_DESC 提示

Description of index_ss_desc_hint.gif follows
插图 "index_ss_desc_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

INDEX_SS_DESC提示指示优化器对指定表执行索引跳过扫描。如果语句使用索引范围扫描并且索引为升序, 则 Oracle 按其索引值的降序扫描索引项。在分区索引中, 结果在每个分区中按降序排列。对于降序索引, 此提示有效地取消了降序, 从而使索引项按升序进行扫描。

每个参数的作用与"索引提示"中的目的相同。例如:

SELECT /*+ INDEX_SS_DESC(e emp_name_ix) */ last_name
  FROM employees e
  WHERE first_name = 'Steven';

另请参见:

Oracle 数据库性能调整指南有关索引跳过扫描的信息

领导提示

Description of leading_hint.gif follows
插图 "leading_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

LEADING提示指示优化器将指定的表集用作执行计划中的前缀。此提示比 "已ORDERED" 提示更通用。例如:

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;

如果指定的表不能按照联接图中的依赖项指定的顺序首先联接, 则忽略LEADING提示。如果指定了两个或多个冲突的LEADING提示, 则所有它们都将被忽略。如果指定ORDERED提示, 则它将覆盖所有LEADING提示。

合并提示

Description of merge_hint.gif follows
插图 "merge_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

通过MERGE提示, 可以在查询中合并视图。

如果视图的查询块包含SELECT列表中的GROUP BY子句或DISTINCT的运算符, 则只有在启用了复杂视图合并时, 优化程序才可以将视图合并到访问语句中。如果子查询不相关, 也可以使用复杂合并将 in 子查询合并到访问语句中. IN

例如:

SELECT /*+ MERGE(v) */ e1.last_name, e1.salary, v.avg_salary
   FROM employees e1,
        (SELECT department_id, avg(salary) avg_salary 
           FROM employees e2
           GROUP BY department_id) v 
   WHERE e1.department_id = v.department_id
     AND e1.salary > v.avg_salary
   ORDER BY e1.last_name;

如果在没有参数的情况下使用MERGE提示, 则应将其放在视图查询块中。MERGE与视图名称作为参数一起使用时, 它应该放在周围的查询中。

MODEL_MIN_ANALYSIS 提示

Description of model_min_analysis_hint.gif follows
插图 "model_min_analysis_hint" 的说明

MODEL_MIN_ANALYSIS提示指示优化程序省略电子表格规则的某些编译时优化-主要是详细的依赖关系图分析。优化程序仍然使用其他电子表格优化, 例如创建筛选器以有选择地填充电子表格访问结构和限制规则修剪。

此提示减少了编译时间, 因为如果电子表格规则的数量超过数以百计, 则电子表格分析可能会很长。

监视器提示

Description of monitor_hint.gif follows
插图 "monitor_hint" 的说明

即使语句没有长时间运行,MONITOR提示也会强制对查询进行实时 SQL 监视。仅当参数CONTROL_MANAGEMENT_PACK_ACCESS设置为DIAGNOSTIC+TUNING时, 此提示才有效。.

另请参见:

Oracle 数据库性能调整指南有关实时 SQL 监视的详细信息

NATIVE_FULL_OUTER_JOIN 提示

Description of native_foj_hint.gif follows
插图 "native_foj_hint" 的说明

NATIVE_FULL_OUTER_JOIN提示指示优化器使用本机完整外部联接, 该连接是基于哈希联接的本机执行方法。

另请参见:

  • NO_NATIVE_FULL_OUTER_JOIN 提示

  • Oracle 数据库性能调整指南有关本机完整外部联接的详细信息

NOAPPEND 提示

Description of noappend_hint.gif follows
插图 "noappend_hint" 的说明

NOAPPEND提示通过在INSERT语句的持续时间内禁用并行模式, 指示优化程序使用常规INSERT常规INSERT是串行模式中的默认值, 直接路径INSERT是并行模式下的默认设置。

非缓存提示

Description of nocache_hint.gif follows
插图 "nocache_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NOCACHE缓存提示指示优化器在执行完整表扫描时, 将检索到表的块放在缓冲区缓存中最近使用的 LRU 列表的末尾。这是缓冲区缓存中块的正常行为。例如:

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

CACHEtable table NOCACHE缓存提示会影响系统统计表scans(longtables)) 和表scans(shorttables)), 如V$SYSSTAT SYSSTAT 视图所示。

另请参见:

Oracle 数据库性能调整指南 , 以了解有关表的自动缓存的信息, 具体取决于它们的大小

NO_EXPAND 提示

Description of no_expand_hint.gif follows
插图 "no_expand_hint" 的说明

(请参见"在提示中指定查询块")

NO_EXPAND提示IN指示优化程序不要考虑OR扩展, 以便查询在WHERE子句中具有OR条件或列表中。通常, 优化器考虑使用OR扩展, 如果它决定成本低于不使用它, 则使用此方法。例如:

SELECT /*+ NO_EXPAND */ *
  FROM employees e, departments d
  WHERE e.manager_id = 108
     OR d.department_id = 110;

另请参见:

"USE_CONCAT 提示", 这与此提示相反

NO_FACT 提示

Description of no_fact_hint.gif follows
插图 "no_fact_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

在星型转换的上下文中使用NO_FACT提示。它指示优化器不应将查询的表视为事实数据表。

NO_INDEX 提示

Description of no_index_hint.gif follows
插图 "no_index_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

NO_INDEX提示指示优化程序不要对指定表使用一个或多个索引。例如:

SELECT /*+ NO_INDEX(employees emp_empid) */ employee_id 
  FROM employees 
  WHERE employee_id > 200; 

每个参数都与"索引提示"中的目标相同, 并进行以下修改:

  • 如果此提示指定了单个可用索引, 则优化程序不考虑对此索引进行扫描。仍会考虑未指定的其他索引。

  • 如果此提示指定可用索引的列表, 则优化程序不考虑对任何指定索引进行扫描。仍会考虑列表中未指定的其他索引。

  • 如果此提示未指定索引, 则优化程序不考虑对表上的任何索引进行扫描。此行为与为表指定所有可用索引的列表的NO_INDEX提示相同。

NO_INDEX提示适用于基于函数、B 树、位图、群集或域索引。如果NO_INDEX提示和索引提示 (INDEX、 INDEX_ASC、 INDEX_DESC、 INDEX_COMBINEINDEX_FFS) 都指定了相同的索引, 则数据库将忽略NO_INDEX提示和指定索引的索引提示, 并考虑在语句执行期间使用的索引。

NO_INDEX_FFS 提示

Description of no_index_ffs_hint.gif follows
插图 "no_index_ffs_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

NO_INDEX_FFS提示指示优化器排除指定表上的指定索引的快速完整索引扫描。每个参数的作用与"NO_INDEX 提示"中的目的相同。例如:

SELECT /*+ NO_INDEX_FFS(items item_order_ix) */ order_id
  FROM order_items items;

NO_INDEX_SS 提示

Description of no_index_ss_hint.gif follows
插图 "no_index_ss_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

NO_INDEX_SS提示指示优化器排除指定表上的指定索引的跳过扫描。每个参数的作用与"NO_INDEX 提示"中的目的相同。.

另请参见:

Oracle 数据库性能调整指南有关索引跳过扫描的信息

NO_MERGE 提示

Description of no_merge_hint.gif follows
插图 "no_merge_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NO_MERGE提示指示优化程序不要将外部查询和任何内联视图查询合并到单个查询中。

此提示使您对访问视图的方式有更深远的影响。例如, 下面的语句导致视图seattle_dept不被合并:

SELECT /*+ NO_MERGE(seattle_dept) */ e1.last_name, seattle_dept.department_name
  FROM employees e1,
       (SELECT location_id, department_id, department_name
          FROM departments
          WHERE location_id = 1700) seattle_dept
  WHERE e1.department_id = seattle_dept.department_id;

在视图查询块中使用NO_MERGE提示时, 请在没有参数的情况下指定它。在周围查询中指定NO_MERGE时, 将视图名称指定为参数。

NO_MONITOR 提示

Description of no_monitor_hint.gif follows
插图 "no_monitor_hint" 的说明

即使查询长时间运行, NO_MONITOR提示也会禁用查询的实时 SQL 监视。

NO_NATIVE_FULL_OUTER_JOIN 提示

Description of no_native_foj_hint.gif follows
插图 "no_native_foj_hint" 的说明

NO_NATIVE_FULL_OUTER_JOIN提示指示优化器在联接每个指定表时排除本机执行方法。而是将整个外部联接作为左外部联接和反联接的联合执行。

另请参见:

NATIVE_FULL_OUTER_JOIN 提示

NO_PARALLEL 提示

Description of no_parallel_hint.gif follows
插图 "no_parallel_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NO_PARALLEL提示指示优化器串行运行语句。此提示将重写PARALLEL_DEGREE_POLICY初始化参数的值。它还重写创建或更改表的 DDL 中的PARALLEL参数。例如, 下面的SELECT语句将连续运行:

ALTER TABLE employees PARALLEL 8;
SELECT /*+ NO_PARALLEL(hr_emp) */ last_name
  FROM employees hr_emp;

另请参见:

  • "并行提示注释"有关并行提示的详细信息

  • Oracle 数据库引用有关PARALLEL_DEGREE_POLICY初始化参数的详细信息

NOPARALLEL 提示

NOPARALLEL提示已被否决。请改用NO_PARALLEL提示。

NO_PARALLEL_INDEX 提示

Description of no_parallel_index_hint.gif follows
插图 "no_parallel_index_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

NO_PARALLEL_INDEX提示重写 DDL 中创建或更改索引的PARALLEL参数, 从而避免了并行索引扫描操作。

另请参见:

"并行提示注释"有关并行提示的详细信息

NOPARALLEL_INDEX 提示

NOPARALLEL_INDEX提示已被否决。请改用NO_PARALLEL_INDEX提示。

NO_PUSH_PRED 提示

Description of no_push_pred_hint.gif follows
插图 "no_push_pred_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NO_PUSH_PRED提示指示优化程序不要将联接谓词推送到视图中。例如:

SELECT /*+ NO_MERGE(v) NO_PUSH_PRED(v) */ *
  FROM employees e,
       (SELECT manager_id
          FROM employees) v
  WHERE e.manager_id = v.manager_id(+)
    AND e.employee_id = 100;

NO_PUSH_SUBQ 提示

Description of no_push_subq_hint.gif follows
插图 "no_push_subq_hint" 的说明

(请参见"在提示中指定查询块")

NO_PUSH_SUBQ提示指示优化器将 nonmerged 子查询计算为执行计划中的最后一步。如果子查询相对较贵或不显著减少行数, 那么这样做可以提高性能。

NO_PX_JOIN_FILTER 提示

Description of no_px_join_filter_hint.gif follows
插图 "no_px_join_filter_hint" 的说明

此提示防止优化器使用并行联接位图筛选。

NO_QUERY_TRANSFORMATION 提示

Description of no_query_transformatn_hint.gif follows
插图 "no_query_transformatn_hint" 的说明

NO_QUERY_TRANSFORMATION提示指示优化器跳过所有查询转换, 包括但不限于OR扩展、视图合并、子查询 unnesting、星型转换和实例化视图重写。例如:

SELECT /*+ NO_QUERY_TRANSFORMATION */ employee_id, last_name
  FROM (SELECT * FROM employees e) v
  WHERE v.last_name = 'Smith';

NO_RESULT_CACHE 提示

Description of no_result_cache_hint.gif follows
插图 "no_result_cache_hint" 的说明

如果RESULT_CACHE_MODE初始化参数设置为FORCE, 优化程序会在结果缓存中缓存查询结果。在这种情况下, NO_RESULT_CACHE提示将禁用当前查询的此类缓存。

如果从保监处客户端执行查询, 并且启用了保监客户端结果缓存, 则NO_RESULT_CACHE提示将禁用当前查询的缓存。

NO_REWRITE 提示

Description of no_rewrite_hint.gif follows
插图 "no_rewrite_hint" 的说明

(请参见"在提示中指定查询块")

NO_REWRITE提示指示优化器禁用查询块的查询重写, 重写参数QUERY_REWRITE_ENABLED的设置。例如:

SELECT /*+ NO_REWRITE */ sum(s.amount_sold) AS dollars
  FROM sales s, times t
  WHERE s.time_id = t.time_id
  GROUP BY t.calendar_month_desc;

NOREWRITE 提示

NOREWRITE提示已被否决。请改用NO_REWRITE提示。

NO_STAR_TRANSFORMATION 提示

Description of no_star_transformation_hint.gif follows
插图 "no_star_transformation_hint" 的说明

(请参见"在提示中指定查询块")

NO_STAR_TRANSFORMATION提示指示优化程序不要执行星型查询转换。

NO_STATEMENT_QUEUING 提示

Description of no_statement_queuing_hint.gif follows
插图 "no_statement_queuing_hint" 的说明

NO_STATEMENT_QUEUING提示会影响语句是否与并行语句队列一起排队。

PARALLEL_DEGREE_POLICY设置为AUTO时, 此提示允许语句绕过并行语句队列。但是, 绕过语句队列的语句可能会导致系统超出由PARALLEL_SERVERS_TARGET初始化参数的值定义的并行执行服务器的最大数目, 这将决定启动并行语句队列的限制。

无法保证绕过并行语句队列的语句收到请求的并行执行服务器的数量, 因为只有系统上可用的并行执行服务器数, 直到PARALLEL_MAX_SERVERS初始化参数, 可以分配。

例如:

SELECT /*+ NO_STATEMENT_QUEUING */ emp.last_name, dpt.department_name
  FROM employees emp, departments dpt
  WHERE emp.department_id = dpt.department_id;

另请参见:

"STATEMENT_QUEUING 提示"

NO_UNNEST 提示

Description of no_unnest_hint.gif follows
插图 "no_unnest_hint" 的说明

(请参见"在提示中指定查询块")

使用NO_UNNEST提示关闭 unnesting。

NO_USE_HASH 提示

Description of no_use_hash_hint.gif follows
插图 "no_use_hash_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NO_USE_HASH提示指示优化器在将每个指定的表连接到其他行源时, 使用指定的表作为内部表来排除哈希联接。例如:

SELECT /*+ NO_USE_HASH(e d) */ *
  FROM employees e, departments d
  WHERE e.department_id = d.department_id;

NO_USE_MERGE 提示

Description of no_use_merge_hint.gif follows
插图 "no_use_merge_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NO_USE_MERGE提示指示优化器在将每个指定的表连接到另一个行源时, 使用指定的表作为内部表来排除排序合并联接。例如:

SELECT /*+ NO_USE_MERGE(e d) */ *
   FROM employees e, departments d
   WHERE e.department_id = d.department_id
   ORDER BY d.department_id;

NO_USE_NL 提示

Description of no_use_nl_hint.gif follows
插图 "no_use_nl_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

NO_USE_NL提示指示优化器在将每个指定的表连接到其他行源时, 使用指定的表作为内部表来排除嵌套循环联接。例如:

SELECT /*+ NO_USE_NL(l h) */ *
  FROM orders h, order_items l
  WHERE l.order_id = h.order_id
    AND l.order_id > 2400;

指定此提示时, 只考虑指定表的哈希联接和排序合并联接。但是, 在某些情况下, 表只能通过使用嵌套循环来联接。在这种情况下, 优化程序会忽略这些表的提示。

NO_XML_QUERY_REWRITE 提示

Description of no_xml_query_rewrite_hint.gif follows
插图 "no_xml_query_rewrite_hint" 的说明

NO_XML_QUERY_REWRITE提示指示优化程序禁止在 SQL 语句中重写 XPath 表达式。通过禁止重写 XPath 表达式, 此提示还禁止对当前查询使用任何 XMLIndexes。例如:

SELECT /*+NO_XML_QUERY_REWRITE*/ XMLQUERY('<A/>' RETURNING CONTENT)
  FROM DUAL;

另请参见:

"NO_XMLINDEX_REWRITE 提示"

NO_XMLINDEX_REWRITE 提示

Description of no_xmlindex_rewrite_hint.gif follows
插图 "no_xmlindex_rewrite_hint" 的说明

NO_XMLINDEX_REWRITE提示指示优化程序不要对当前查询使用任何 XMLINDEX 索引。例如:

SELECT /*+NO_XMLINDEX_REWRITE*/ count(*) 
  FROM warehouses
  WHERE existsNode(warehouse_spec, '/Warehouse/Building') = 1;

另请参见:

"NO_XML_QUERY_REWRITE 提示"以另一种方式禁用 XMLIndexes 的使用

OPT_PARAM 提示

Description of opt_param_hint.gif follows
插图 "opt_param_hint" 的说明

OPT_PARAM提示允许您仅为当前查询的持续时间设置初始化参数。此提示仅对以下参数有效: OPTIMIZER_DYNAMIC_SAMPLING、 OPTIMIZER_INDEX_CACHING、 OPTIMIZER_INDEX_COST_ADJ、 OPTIMIZER_SECURE_VIEW_MERGINGSTAR_TRANSFORMATION_ENABLED例如, 下面的提示将参数STAR_TRANSFORMATION_ENABLED设置为它添加到的语句的TRUE :

SELECT /*+ OPT_PARAM('star_transformation_enabled' 'true') */ *
  FROM ... ;

字符串的参数值括在单引号中。数值参数值未指定引号。

订购提示

Description of ordered_hint.gif follows
插图 "ordered_hint" 的说明

order 提示指示 Oracle 按照它们在ORDERED FROM子句中的显示顺序联接表。Oracle 建议您使用LEADING提示, 它比ORDERED提示更通用。

当从需要联接的 SQL 语句中省略 order 提示时, 优化器将选择联接表的顺序. ORDERED如果您知道某个优化程序不知道从每个表中选择的行数, 则可能需要使用 order 提示来指定联接顺序. ORDERED此类信息使您可以比优化程序更好地选择内部和外部表。

下面的查询是使用ORDERED提示的示例:

SELECT  /*+ ORDERED */ o.order_id, c.customer_id, l.unit_price * l.quantity
  FROM customers c, order_items l, orders o
  WHERE c.cust_last_name = 'Taylor'
    AND o.customer_id = c.customer_id
    AND o.order_id = l.order_id;

并行提示

关于并行提示的注意事项

从 Oracle 数据库 11g 2 版 (11.2.0.1) 开始,PARALLELNO_PARALLEL提示是语句级提示, 取代了前面的对象级提示: PARALLEL_INDEXNO_PARALLEL_INDEX和以前指定的PARALLELNO_PARALLEL提示。对于PARALLEL, 如果指定integer, 则该语句将使用并行度。如果省略integer, 则数据库将计算并行度。可以使用并行性的所有访问路径都将使用指定的或计算的并行度。

在下面的语法图中, parallel_hint_statement显示语句级提示的语法, parallel_hint_object显示对象级提示的语法。对象级提示支持向后兼容性, 并被语句级提示取代。

parallel_hint_statement::=

Description of parallel_hint_statement.gif follows
插图 "parallel_hint_statement" 的说明

parallel_hint_object::=

Description of parallel_hint_object.gif follows
插图 "parallel_hint_object" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

PARALLEL提示指示优化器使用指定数量的并发服务器进行并行操作。此提示将重写PARALLEL_DEGREE_POLICY初始化参数的值。该提示适用于SELECTINSERTMERGEUPDATEDELETE语句的部分, 以及表扫描部分。如果违反了任何并行限制, 则忽略提示。

注意:

如果排序或分组操作也发生, 则可以使用的服务器数两倍于PARALLEL提示中的值。

对于语句级并行提示:

  • PARALLEL: 语句始终是并行运行的, 数据库计算并行度 (可为2或更高)。

  • PARALLEL(DEFAULT): 优化器计算的并行度等于所有参与实例上可用的 cpu 数乘以PARALLEL_THREADS_PER_CPU初始化参数的值。

  • PARALLEL(AUTO): 数据库计算并行度 (可为1或更高)。如果并行度的计算程度为 1, 则语句依次运行。

  • PARALLEL(MANUAL): 优化器被迫使用语句中对象的并行设置。

  • PARALLEL(integer): 优化器使用integer指定的并行度.

在下面的示例中, 优化器计算并行度。语句始终并行运行。

SELECT /*+ PARALLEL */ last_name
  FROM employees;

在下面的示例中, 优化器计算并行度, 但该程度可能为 1, 在这种情况下, 语句将连续运行。

SELECT /*+ PARALLEL (AUTO) */ last_name
  FROM employees;

在下面的示例中,PARALLEL提示建议优化器使用当前对表本身有效的并行度, 即 5:

CREATE TABLE parallel_table (col1 number, col2 VARCHAR2(10)) PARALLEL 5; 

SELECT /*+ PARALLEL (MANUAL) */ col2
  FROM parallel_table;

对于对象级并行提示:

  • PARALLEL: 查询协调器应检查初始化参数的设置, 以确定默认的并行度。

  • PARALLEL(integer): 优化器使用integer指定的并行度.

  • PARALLEL(DEFAULT): 优化器计算的并行度等于所有参与实例上可用的 cpu 数乘以PARALLEL_THREADS_PER_CPU初始化参数的值。

在下面的示例中,PARALLEL提示重写employees表定义中指定的并行度:

SELECT /*+ FULL(hr_emp) PARALLEL(hr_emp, 5) */ last_name
  FROM employees hr_emp;

在下一示例中,PARALLEL提示重写employees表定义中指定的并行度, 并指示优化器计算与所有可用的 cpu 数相等的并行度。参与实例乘以PARALLEL_THREADS_PER_CPU初始化参数的值。

SELECT /*+ FULL(hr_emp) PARALLEL(hr_emp, DEFAULT) */ last_name
  FROM employees hr_emp;

有关并行执行的详细信息, 请参阅创建表 Oracle 数据库概念 。

另请参见:

  • 创建表 Oracle 数据库概念有关并行执行的更多信息。

  • Oracle 数据库 PL/SQL 包和类型引用中有关DBMS_PARALLEL_EXECUTE包的信息, 该程序提供了在行块中应用表更改的方法。当没有错误时, 对每个块的更改都是独立提交的。

  • Oracle 数据库引用有关PARALLEL_DEGREE_POLICY初始化参数的详细信息

  • NO_PARALLEL 提示

PARALLEL_INDEX 提示

Description of parallel_index_hint.gif follows
插图 "parallel_index_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: =indexspec:: =)

PARALLEL_INDEX提示指示优化器使用指定数量的并发服务器并行化索引范围扫描、完全扫描和对已分区索引的快速完整扫描。

integer值指示指定索引的并行度。指定DEFAULT或无值意味着查询协调器应检查初始化参数的设置, 以确定默认的并行度。例如, 下面的提示表示要使用三并行执行过程:

SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */

另请参见:

"并行提示注释"有关并行提示的详细信息

PQ_DISTRIBUTE 提示

Description of pq_distribute_hint.gif follows
插图 "pq_distribute_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

PQ_DISTRIBUTE提示指示优化器如何在生产者和使用者查询服务器之间分发行。可以控制联接或负载的行分布。

负荷分配控制可以控制并行INSERT的行分布.。SELECT和并行CREATETABLE..。ASSELECT语句指示如何在生产者 (查询) 和使用者 (负载) 服务器之间分配行。通过指定单个分发方法, 可以使用语法的上部分支。分发方法及其语义的值在表 3-22中进行了说明。.

表3-22 负载的分布值

分布 描述

NONE

没有分发。即查询和加载操作被合并到每个查询服务器中。所有服务器都将加载所有分区。这种分布的缺乏有助于避免在没有倾斜的情况下分发行的开销。由于空段或语句中的谓词筛选出由查询计算的所有行, 可能会发生倾斜。如果由于使用此方法而出现倾斜, 请改用RANDOMRANDOM_LOCAL分发。

注意: 请小心使用此分发。每个加载的分区都需要至少 512 KB 的 PGA 内存进程。如果您也使用压缩, 那么大约 1.5 MB 的 PGA 内存是每个服务器的使用者。

PARTITION

此方法使用tablespec的分区信息将行从查询服务器分发到负载服务器。当加载的分区数大于或等于负载服务器数时, 如果无法或希望组合查询和加载操作, 则使用此分发方法, 并且输入数据将均匀分布在正在加载的分区-即没有倾斜。

RANDOM

这种方法以循环方式向消费者分发来自生产者的行。当输入数据高度倾斜时, 请使用此分发方法。

RANDOM_LOCAL

此方法将生成器中的行分配给负责维护给定分区集的一组服务器。两个或多个服务器可以加载同一分区, 但没有服务器加载所有分区。当输入数据倾斜且由于内存限制而无法合并查询和加载操作时, 请使用此分发方法。


例如, 在以下直接加载插入操作中, 操作的查询和加载部分将合并到每个查询服务器中:

INSERT /*+ APPEND PARALLEL(target_table, 16) PQ_DISTRIBUTE(target_table, NONE) */
  INTO target_table
  SELECT * FROM source_table;
 

在下表创建示例中, 优化器使用 target_table 的分区来分发行:

CREATE /*+ PQ_DISTRIBUTE(target_table, PARTITION) */ TABLE target_table
  NOLOGGING PARALLEL 16
  PARTITION BY HASH (l_orderkey) PARTITIONS 512
  AS SELECT * FROM source_table; 

连接分配的控制通过指定两种分发方法来控制联接的分发方法, 如语法图的下部分支所示, 外部表的一个分发和内部表的一个分发。

  • outer_distribution是外部表的分发。

  • inner_distribution是内部表的分发。

分布的值为HASHBROADCASTPARTITIONNONE只有六组合表分布有效, 如表 3-23中所述:

表3-23 联接的分布值

分布 描述

HASH,HASH

每个表的行都映射到使用者查询服务器, 并在联接键上采用哈希函数。完成映射后, 每个查询服务器将在一对生成的分区之间执行联接。当表在大小上可比较且联接操作由哈希联接或排序合并联接实现时, 建议使用此分发。

BROADCAST,NONE

外部表的所有行都将广播给每个查询服务器。内部表行是随机分区的。当外部表与内部表比较小时, 建议使用此分布。一般规则是, 当内部表大小乘以查询服务器的数目大于外部表大小时, 请使用此分布。

NONE,BROADCAST

内部表的所有行都将广播给每个使用者查询服务器。外部表行是随机分区的。当内部表与外表比较小时, 建议使用此分布。通常情况下, 当内部表大小乘以查询服务器的数目小于外部表大小时, 请使用此分布。

PARTITIONNONE

外部表的行使用内部表的分区进行映射。内部表必须在联接键上分区。当外部表的分区数等于或几乎等于查询服务器数量的倍数时, 建议使用此分布;例如, 14 个分区和15个查询服务器。

注意: 如果内部表未分区或在分区键上不 equijoined, 优化程序将忽略此提示。

NONE,PARTITION

内部表的行使用外部表的分区进行映射。必须在联接键上对外部表进行分区。当外部表的分区数等于或几乎等于查询服务器数量的倍数时, 建议使用此分布;例如, 14 个分区和15个查询服务器。

注意: 如果在分区键上未对外部表进行分区或不 equijoined, 优化程序将忽略此提示。

NONE,NONE

每个查询服务器在一对匹配的分区之间执行联接操作, 每个表都有一个。两个表必须在联接键上 equipartitioned。


例如, 给定两个使用哈希联接联接的表rs , 下面的查询包含使用哈希分布的提示:

SELECT /*+ORDERED PQ_DISTRIBUTE(s HASH, HASH) USE_HASH (s)*/ column_list
  FROM r,s
  WHERE r.c=s.c;

要广播外部表r, 查询为:

SELECT /*+ORDERED PQ_DISTRIBUTE(s BROADCAST, NONE) USE_HASH (s) */ column_list
  FROM r,s
  WHERE r.c=s.c;

另请参见:

oracle 数据库性能优化指南有关 Oracle parallelizes 如何联接操作的详细信息

PUSH_PRED 提示

Description of push_pred_hint.gif follows
插图 "push_pred_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

PUSH_PRED提示指示优化器将联接谓词推送到视图中。例如:

SELECT /*+ NO_MERGE(v) PUSH_PRED(v) */ *
  FROM employees e,
    (SELECT manager_id
      FROM employees) v
  WHERE e.manager_id = v.manager_id(+)
    AND e.employee_id = 100;

PUSH_SUBQ 提示

Description of push_subq_hint.gif follows
插图 "push_subq_hint" 的说明

(请参见"在提示中指定查询块")

PUSH_SUBQ提示指示优化程序在执行计划中尽可能早的步骤计算 nonmerged 子查询。通常, 未合并的子查询将作为执行计划中的最后一步执行。如果子查询相对较便宜, 并显著减少行数, 则较早计算子查询可以提高性能。

如果将子查询应用于远程表或使用合并连接联接的一个, 则此提示无效。

PX_JOIN_FILTER 提示

Description of px_join_filter_hint.gif follows
插图 "px_join_filter_hint" 的说明

此提示强制优化器使用并行联接位图筛选。

QB_NAME 提示

Description of qb_name_hint.gif follows
插图 "qb_name_hint" 的说明

(请参见"在提示中指定查询块")

使用QB_NAME提示定义查询块的名称。然后, 可以在外部查询中的提示中使用此名称, 或者甚至在内嵌视图中的提示中用于影响在命名查询块中出现的表的查询执行。

如果两个或多个查询块同名, 或者同一查询块用不同的名称暗示两次, 则优化程序将忽略引用该查询块的所有名称和提示。没有使用此提示命名的查询块具有唯一的系统生成的名称。这些名称可以显示在计划表中, 也可以用于查询块中的提示或查询块提示中。例如:

SELECT /*+ QB_NAME(qb) FULL(@qb e) */ employee_id, last_name
  FROM employees e
  WHERE last_name = 'Smith';

RESULT_CACHE 提示

Description of result_cache_hint.gif follows
插图 "result_cache_hint" 的说明

RESULT_CACHE提示指示数据库在内存中缓存当前查询或查询片段的结果, 然后在查询或查询片段的将来执行中使用缓存结果。在顶层查询、 subquery_factoring_clauseFROM子句内联视图中识别提示。缓存的结果驻留在共享池的结果缓存内存部分中。

每当成功修改其创建中使用的数据库对象时, 缓存结果都会自动失效。此提示优先于RESULT_CACHE_MODE初始化参数的设置。

只有当查询中所涉及的所有函数 (例如内置的或用户定义的函数或虚拟列) 具有确定性时, 查询才符合结果缓存的条件。

如果从保监处客户端执行查询, 并且启用了保监客户端结果缓存, 则RESULT_CACHE提示将启用当前查询的客户端缓存。

另请参见:

Oracle 数据库性能优化指南有关使用此提示的信息, Oracle 数据库引用有关 RESULT_CACHE_MODE 初始化参数的信息, 以及   Oracle 调用接口程序员指南 有关保监结果缓存和使用指南的详细信息

RETRY_ON_ROW_CHANGE 提示

Description of retry_on_row_change.gif follows
插图 "retry_on_row_change" 的说明

注意:

CHANGE_DUPKEY_ERROR_INDEX、 IGNORE_ROW_ON_DUPKEY_INDEXRETRY_ON_ROW_CHANGE提示与其他提示不同, 因为它们具有语义效果。 "提示"中解释的一般哲学不适用于这三提示。

此提示仅对UPDATEDELETE操作有效。INSERTMERGE操作不支持它。当指定此提示时, 当集中的一个或多个行的ORA_ROWSCN从要修改的行集被确定为实际修改块的时间时, 将重试该操作。

另请参见:

IGNORE_ROW_ON_DUPKEY_INDEX 提示CHANGE_DUPKEY_ERROR_INDEX 提示有关这些提示和 Oracle 数据库性能调整指南的信息, 以了解有关使用联机应用程序升级的更多信息 相关提示

改写提示

Description of rewrite_hint.gif follows
插图 "rewrite_hint" 的说明

(请参见"在提示中指定查询块")

REWRITE提示指示优化器根据实例化视图 (如果可能的话) 重写查询, 而无需考虑成本。使用REWRITE提示或不带视图列表。如果对视图列表使用REWRITE, 并且该列表包含符合条件的实例化视图, 则 Oracle 将使用该视图, 而不管其成本如何。

Oracle 不考虑列表之外的视图。如果不指定视图列表, 则 Oracle 将搜索符合条件的实例化视图, 并始终使用它, 而不管最终计划的成本如何。

另请参见:

  • Oracle 数据库概念和 Oracle 数据库高级复制有关实例化视图的更多信息

  • Oracle 数据库数据仓库指南有关使用实例化视图REWRITE的详细信息

STAR_TRANSFORMATION 提示

Description of star_transformation_hint.gif follows
插图 "star_transformation_hint" 的说明

(请参见"在提示中指定查询块")

STAR_TRANSFORMATION提示指示优化器使用使用转换的最佳计划。如果没有提示, 优化器可以进行查询优化决策, 以使用生成的最佳计划而不进行转换, 而不是转换查询的最佳计划。例如:

SELECT /*+ STAR_TRANSFORMATION */ s.time_id, s.prod_id, s.channel_id
  FROM sales s, times t, products p, channels c
  WHERE s.time_id = t.time_id
    AND s.prod_id = p.prod_id
    AND s.channel_id = c.channel_id
    AND c.channel_desc = 'Tele Sales';

即使指定了提示, 也无法保证转换将进行。只有在看似合理的情况下, 优化程序才生成子查询。如果不生成子查询, 则不存在转换的查询, 并且使用未变形查询的最佳计划, 而不考虑提示。

另请参见:

  • Oracle 数据库数据仓库指南以全面讨论星形转换。

  • Oracle 数据库引用 , 了解有关STAR_TRANSFORMATION_ENABLED初始化参数的详细信息。

STATEMENT_QUEUING 提示

Description of statement_queuing_hint.gif follows
插图 "statement_queuing_hint" 的说明

NO_STATEMENT_QUEUING提示会影响语句是否与并行语句队列一起排队。

PARALLEL_DEGREE_POLICY未设置为AUTO时, 此提示允许为并行语句队列考虑语句, 但仅当有足够的并行进程可在请求的 DOP 上运行时才运行。在启用队列之前, 可用并行执行服务器的数量等于所使用的并行执行服务器数与系统中允许的最大数目之间的差异, 这是由PARALLEL_SERVERS_TARGET初始化参数。

例如:

SELECT /*+ STATEMENT_QUEUING */ emp.last_name, dpt.department_name
  FROM employees emp, departments dpt
  WHERE emp.department_id = dpt.department_id;

另请参见:

"NO_STATEMENT_QUEUING 提示"

UNNEST 提示

Description of unnest_hint.gif follows
插图 "unnest_hint" 的说明

(请参见"在提示中指定查询块")

UNNEST提示指示优化器将子查询的正文 UNNEST 并合并到包含它的查询块的正文中, 以便优化器在计算访问路径和联接时一并考虑它们。

在 unnested 子查询之前, 优化程序首先验证该语句是否有效。然后, 该语句必须传递启发式和查询优化测试。UNNEST提示指示优化程序仅检查子查询块的有效性。如果子查询块有效, 则在不检查启发式或开销的情况下启用子查询 unnesting。

另请参见:

  • "集合 Unnesting: 示例"有关 Unnesting 嵌套子查询和使子查询块有效的条件的详细信息

  • Oracle 数据库性能调整指南有关子查询 unnesting 的其他信息

USE_CONCAT 提示

Description of use_concat_hint.gif follows
插图 "use_concat_hint" 的说明

(请参见"在提示中指定查询块")

USE_CONCAT提示指示优化器将查询WHERE子句中的组合OR条件转换为使用UNIONALLset 运算符的复合查询。如果没有此提示, 则仅当使用串联的查询开销比没有它们的成本更低时, 才会发生此转换。USE_CONCAT提示会覆盖成本考虑。例如:

SELECT /*+ USE_CONCAT */ *
  FROM employees e
  WHERE manager_id = 108
     OR department_id = 110;

另请参见:

"NO_EXPAND 提示", 这与此提示相反

USE_HASH 提示

Description of use_hash_hint.gif follows
插图 "use_hash_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

USE_HASH提示指示优化器使用哈希联接将每个指定的表与另一个行源联接起来。例如:

SELECT /*+ USE_HASH(l h) */ *
  FROM orders h, order_items l
  WHERE l.order_id = h.order_id
    AND l.order_id > 2400;

USE_MERGE 提示

Description of use_merge_hint.gif follows
插图 "use_merge_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

USE_MERGE提示指示优化器使用排序合并联接将每个指定的表与另一个行源联接起来。例如:

SELECT /*+ USE_MERGE(employees departments) */ * 
  FROM employees, departments 
  WHERE employees.department_id = departments.department_id;

建议使用USE_NLUSE_MERGE提示以LEADINGORDERED提示。当被引用的表强制为联接的内部表时, 优化器将使用这些提示。如果引用的表是外部表, 则忽略这些提示。

USE_NL 提示

USE_NL提示使用指定的表作为内部表, 指示优化器将每个指定的表与嵌套循环联接连接到另一个行源。

Description of use_nl_hint.gif follows
插图 "use_nl_hint" 的说明

(请参见"在提示中指定查询块"tablespec:: = )

USE_NL提示使用指定的表作为内部表, 指示优化器将每个指定的表与嵌套循环联接连接到另一个行源。

建议使用USE_NLUSE_MERGE提示以LEADINGORDERED提示。当被引用的表强制为联接的内部表时, 优化器将使用这些提示。如果引用的表是外部表, 则忽略提示。

在下面的示例中, 在通过提示强制嵌套循环时, order_id 通过完整表扫描访问, 筛选条件orders l.order_id = h.order_id应用于每一行。对于满足筛选条件的每一行, order_items通过索引order_id访问.

SELECT /*+ USE_NL(l h) */ h.customer_id, l.unit_price * l.quantity
  FROM orders h, order_items l
  WHERE l.order_id = h.order_id;

向查询添加INDEX提示可能会避免对orders进行完整的表扫描, 从而导致执行计划与大型系统上使用的类似, 即使在这里可能并不特别有效。

USE_NL_WITH_INDEX 提示

Description of use_nl_with_index_hint.gif follows
插图 "use_nl_with_index_hint" 的说明

(请参阅"在提示中指定查询块"tablespec:: =indexspec:: = )

USE_NL_WITH_INDEX提示指示优化器将指定的表联接到另一个行源, 并使用指定的表作为内部表联接嵌套循环。例如:

SELECT /*+ USE_NL_WITH_INDEX(l item_product_ix) */ *
  FROM orders h, order_items l
  WHERE l.order_id = h.order_id
    AND l.order_id > 2400;

以下条件适用:

  • 如果未指定索引, 则优化程序必须能够使用至少有一个联接谓词作为索引键的某些索引。

  • 如果指定了索引, 则优化程序必须能够将至少一个联接谓词作为索引键使用该索引。

猜你喜欢

转载自blog.csdn.net/huyingzuo/article/details/80334785