Oracle高级sql语法学习之hits

Oracle高级sql语法学习之提示(hits)

来源于官方文档翻译

提示(hits)

隐藏语法类型提示关键字语义例子例子描述
Optimization Goals and Approaches优化目标和 方法ALL_ROWSALL_ROWS提示指示优化器以最佳目标优化语句块吞吐量,即最小的总资源消耗。SELECT /*+ ALL_ROWS */ employee_id, last_name, salary, job_id FROM employees WHERE employee_id = 107;
FIRST_ROWSFIRST_ROWS提示指示Oracle优化单个SQL语句以实现快速响应,选择最有效地返回前n行的计划。对于整数,请指定要返回的行数。SELECT /*+ FIRST_ROWS(10) */ employee_id, last_name, salary, job_id FROM employees WHERE department_id = 20;
Access Path Hints访问路径CLUSTERCLUSTER提示指示优化器使用集群扫描来访问指定的表。此提示仅适用于索引集群中的表。
CLUSTERING此提示仅对启用属性集群的表上的INSERT和MERGE操作有效。clustering提示为直接路径插入(串行或并行)启用属性集群。这导致部分聚集的数据,即每次插入或合并操作聚集的数据。此提示覆盖创建或更改表的DDL中的NO ON LOAD设置。此提示对未启用属性集群的表没有影响。
NO_CLUSTERING此提示仅对启用属性集群的表上的INSERT和MERGE操作有效。NO_clustering提示为直接路径插入(串行或并行)禁用属性集群。该提示覆盖了创建或更改表的DDL中的YESONLOAD设置。此提示对未启用属性集群的表没有影响。
FULLFULL提示指示优化器对指定的表执行全表扫描SELECT /*+ FULL(e) */ employee_id, last_name FROM hr.employees e WHERE last_name LIKE :b1;Oracle Database对employees表执行全表扫描以执行该语句,即使在last_name列上有一个索引,该索引由WHERE子句中的条件提供。 employees表在FROM子句中具有别名e,因此提示必须通过表的别名而不是名称来引用该表。不要在提示中指定架构名称,即使它们是在FROM子句中指定的
HASHHASH提示指示优化器使用哈希扫描来访问指定的表。此提示仅适用于哈希集群中的表。INDEX提示指示优化器对指定的表使用索引扫描。可以将INDEX提示用于基于函数的索引、域索引、B树索引、位图索引和位图连接索引。
INDEXSELECT /+ INDEX (employees emp_department_ix)/ employee_id, department_id FROM employees WHERE department_id > 50;如果INDEX提示指定单个可用索引,则数据库对该索引执行扫描。优化器不考虑全表扫描或表上另一个索引的扫描。 对于多个索引组合的提示,Oracle建议使用 INDEX_COMBINE而不是INDEX,因为它是一个更通用的提示。如果INDEX提示指定了可用索引的列表,则优化器会考虑列表中每个索引的扫描成本,然后以最低的成本执行索引扫描。如果这样的访问路径的成本最低,数据库还可以选择扫描该列表中的多个索引并合并结果。数据库不考虑全表扫描或对提示中未列出的索引的扫描。 如果INDEX提示未指定索引,则优化器会考虑表上每个可用索引的扫描成本,然后以最低的成本执行索引扫描。如果这样的访问路径具有最低的成本,数据库还可以选择扫描多个索引并合并结果。优化器不考虑全表扫描。
NO_INDEXNO_INDEX提示指示优化器不要为指定的表使用一个或多个索引。SELECT /*+ NO_INDEX(employees emp_empid) */ employee_id FROM employees WHERE employee_id > 200;每个参数的用途与INDEX Hint中的相同,但有以下修改: •如果此提示指定了单个可用索引,则优化器不会考虑对此索引进行扫描。其他未指定的指标仍将被考虑。 •如果此提示指定了可用索引的列表,则优化器不会考虑对任何指定索引进行扫描。列表中未指定的其他指标仍将被考虑。 •如果此提示未指定索引,则优化器不会考虑对表上的任何索引进行扫描。此行为与指定表所有可用索引列表的NO_INDEX提示相同。NO_INDEX提示适用于基于函数的索引、B树索引、位图索引、簇索引或域索引。如果NO_INDEX提示和索引提示(INDEX、INDEX_ASC、INDEX_DESC、INDEX_COMBINE或INDEX_FFS)都指定了相同的索引,则数据库会忽略指定索引的NO_INDEX暗示和索引提示,并考虑在执行语句期间使用这些索引。
INDEX_ASCINDEX_ASC提示指示优化器对指定表使用索引扫描。如果语句使用索引范围扫描,则Oracle数据库会按索引值的升序扫描索引条目。每个参数的作用与INDEX提示中的相同。 范围扫描的默认行为是按索引值的升序扫描索引条目,或按降序扫描索引条目。此提示不会更改索引的默认顺序,因此仅指定index提示。但是,如果默认行为发生变化,您可以使用INDEX_ASC提示显式指定升序范围扫描。
INDEX_DESCINDEX_DESC提示指示优化器对指定表使用降序索引扫描。如果语句使用索引范围扫描,并且索引是升序的,则Oracle会按索引值的降序扫描索引条目。在分区索引中,结果在每个分区内按降序排列。对于降序索引,此提示有效地取消了降序,导致按升序扫描索引条目。每个参数的作用与INDEX提示中的相同SELECT /*+ INDEX_DESC(e emp_name_ix) */ * FROM employees e;
INDEX_COMBINEINDEX_COMBINE提示可以使用任何类型的索引:位图、b树或域。如果不在INDEX_COMBINE提示中指定indexspec,优化器将使用尽可能多的索引隐式地将INDEX提示应用于所有索引。如果指定indexspec,则优化器将使用所有合法有效的提示索引,而不管成本如何。每个参数的作用与INDEX提示中的相同。SELECT /*+ INDEX_COMBINE(e emp_manager_ix emp_department_ix) */ * FROM employees e WHERE manager_id = 108 OR department_id = 110;
INDEX_JOININDEX_JOIN提示指示优化器使用索引联接作为访问路径。为了使提示产生积极的效果,必须存在足够少的索引,其中包含解析查询所需的所有列。每个参数的作用与INDEX提示中的相同。SELECT /*+ INDEX_JOIN(e emp_manager_ix emp_department_ix) */ department_id FROM employees e WHERE manager_id < 110 AND department_id < 50;查询使用索引联接来访问manager_id和department_id列,这两列都在employees表中索引。
INDEX_FFSINDEX_FFS提示指示优化器执行快速的全索引扫描,而不是全表扫描。每个参数的作用与INDEX提示中的相同。SELECT /*+ INDEX_FFS(e emp_name_ix) */ first_name FROM employees e;
INDEX_SSINDEX_SS提示指示优化器对指定表执行索引跳过扫描。如果语句使用索引范围扫描,则Oracle会按索引值的升序扫描索引条目。在分区索引中,结果在每个分区内按升序排列。每个参数的作用与INDEX提示中的相同。SELECT /*+ INDEX_SS(e emp_name_ix) */ last_name FROM employees e WHERE first_name = ‘Steven’;
INDEX_SS_ASCINDEX_SS_ASC提示指示优化器对指定表执行索引跳过扫描。如果语句使用索引范围扫描,则Oracle数据库会按索引值的升序扫描索引条目。在分区索引中,结果在每个分区内按升序排列。每个参数的作用与INDEX提示中的相同。范围扫描的默认行为是按索引值的升序扫描索引条目,或按降序扫描索引条目。此提示不会更改索引的默认顺序,因此仅指定index_SS提示。但是,如果默认行为发生变化,您可以使用INDEX_SS_ASC提示显式指定升序范围扫描。
INDEX_SS_DESCINDEX_SS_DESC提示指示优化器对指定表执行索引跳过扫描。如果语句使用索引范围扫描,并且索引是升序的,则Oracle会按索引值的降序扫描索引条目。在分区索引中,结果在每个分区内按降序排列。对于降序索引,此提示有效地取消了降序,导致按升序扫描索引条目。每个参数的用途与索引提示中的相同。SELECT /*+ INDEX_SS_DESC(e emp_name_ix) */ last_name FROM employees e WHERE first_name = ‘Steven’;
NATIVE_FULL_OUTER_JOIN提示指示优化器使用本机完全外部连接,这是一种基于哈希连接的本机执行方法。
NO_NATIVE_FULL_OUTER_JOINNO_NATIVE_FULL_OUTER_JOIN提示指示优化器在连接每个指定表时排除本机执行方法。相反,完整的外部连接是作为左外部连接和反连接的联合来执行的。
NO_INDEX_FFSNO_INDEX_FFS提示指示优化器排除对指定表上指定索引的快速全索引扫描。每个参数的作用与NO_INDEX提示中的相同SELECT /*+ NO_INDEX_FFS(items item_order_ix) */ order_id FROM order_items items;
NO_INDEX_SSNO_INDEX_SS提示指示优化器排除对指定表上指定索引的跳过扫描。每个参数的作用与NO_INDEX提示中的相同。
NO_ZONEMAPNO_ZONEMAP提示禁止对不同类型的修剪使用区域图。此提示会覆盖创建或更改区域图的DDL中的ENABLE PRUNING设置。指定以下选项之一:SCAN-禁用使用区域图进行扫描修剪。JOIN-禁止使用区域图进行联接修剪。PARTITION-禁止使用分区图进行分区修剪
In-Memory Column Store Hints内存列存储INMEMORYINMEMORY提示启用内存查询。此提示不会指示优化器执行全表扫描。如果设计了全表扫描,则还要指定“全提示”。
NO_INMEMORYNO_INMEMORY提示禁用内存查询。
NMEMORY_PRUNINGINMEMORY_PRUNING提示允许修剪内存查询
NO_INMEMORY_PRUNINGNO_INMEMORY_PRUNING提示禁止修剪内存查询。
Join Order HintsORDEREDORDERD提示指示Oracle按照表在FROM子句中出现的顺序连接表。Oracle建议您使用LEADING提示,它比ORDERD提示更通用。当您在需要连接的SQL语句中省略ORDERD提示时,优化器会选择连接表的顺序。如果您知道优化器不知道的关于从每个表中选择的行数的信息,您可能希望使用ORDERD提示指定连接顺序。这些信息使您能够比优化器更好地选择内部和外部表。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;
LEADINGLEADING提示是一个多表提示,可以指定多个表或视图。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;如果由于连接图中的依赖关系,指定的表无法按照指定的顺序首先连接,则忽略LEADING提示。如果您指定了两个或多个冲突的引导提示,则所有这些提示都将被忽略。如果指定ORDERD提示,它将覆盖所有LEADING提示。
Join Operation HintsUSE_BANDUSE_BAND提示指示优化器使用带连接将每个指定的表与另一个行源连接起来。SELECT /*+ USE_BAND(e1 e2) */ e1.last_name || ’ has salary between 100 less and 100 more than ’ || e2.last_name AS “SALARY COMPARISON” FROM employees e1, employees e2 WHERE e1.salary BETWEEN e2.salary - 100 AND e2.salary + 100;USE_BAND提示中列出表的顺序没有指定联接顺序。要提示特定的连接顺序,需要LEADING提示。
NO_USE_BANDNO_USE_BAND提示指示优化器在将每个指定表连接到另一个行源时排除带连接。SELECT /*+ NO_USE_BAND(e1 e2) */ e1.last_name || ’ has salary between 100 less and 100 more than ’ || e2.last_name AS “SALARY COMPARISON” FROM employees e1, employees e2 WHERE e1.salary BETWEEN e2.salary - 100 AND e2.salary + 100;
USE_CUBE当联接的右侧是多维数据集时,USE_cube提示指示优化器使用多维数据集联接将每个指定的表与另一个行源联接。如果优化器根据统计分析决定不使用多维数据集联接,则可以使用use_cube覆盖该决定。
NO_USE_CUBENO_USE_CUBE提示指示优化器在使用指定的表作为内部表将每个指定的表连接到另一行源时排除多维数据集连接
USE_HASHUSE_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_HASH提示中列出的顺序未指定联接顺序。要提示特定的连接顺序,需要LEADING提示。
NO_USE_HASHNO_USE_HASH提示指示优化器在使用指定的表作为内部表将每个指定的表连接到另一个行源时排除哈希连接。SELECT /*+ NO_USE_HASH(e d) */ * FROM employees e, departments d WHERE e.department_id = d.department_id;
USE_MERGEUSE_MERGE提示指示优化器使用排序合并联接将每个指定的表与另一个行源联接SELECT /*+ USE_MERGE(employees departments) */ * FROM employees, departments WHERE employees.department_id = departments.department_id;建议将Use_NL和Use_MERGE提示与LEADING和ORDERED提示一起使用。当被引用的表被强制为联接的内部表时,优化器使用这些提示。如果引用的表是外部表,则忽略提示。
NO_USE_MERGENO_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;
USE_NL建议将Use_NL和Use_MERGE提示与LEADING和ORDERED提示一起使用。当被引用的表被强制为联接的内部表时,优化器使用这些提示。如果引用的表是外部表,则忽略提示。在下面的示例中,通过提示强制嵌套循环,通过全表扫描访问订单,并将筛选条件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; 表在USE_NL提示中列出的顺序未指定联接顺序。要提示特定的连接顺序,需要LEADING提示。 select /+ LEADING(t2) USE_NL(t1) */ sum(t1.a),sum(t2.a) from t1 , t2 where t1.b = t2.b; select * from table(dbms_xplan.display_cursor()) ;向查询添加INDEX提示可以避免对订单进行全表扫描,从而产生类似于在较大系统上使用的执行计划的执行计划,尽管它在这里可能不是特别有效。
USE_NL_WITH_INDEXUSE_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;应用以下条件:•如果未指定索引,则优化器必须能够使用具有至少一个连接谓词作为索引键的某个索引。•如果指定了索引,则优化器必须能够将该索引与至少一个连接谓词一起用作索引键。
NO_USE_NLNO_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;当指定此提示时,对于指定的表,只考虑哈希连接和排序合并连接。然而,在某些情况下,只能通过使用嵌套循环来联接表。在这种情况下,优化器会忽略这些表的提示。
Parallel Execution HintsENABLE_PARALLEL_DMLENABLE_PARALLEL_DML提示为DELETE、INSERT、MERGE和UPDATE语句启用并行DML。可以使用此提示为单个语句启用并行DML,而不是使用ALTER session enable parallel DML语句为会话启用并行DML
DISABLE_PARALLEL_DMLDISABLE_PARALLEL_DML提示为DELETE、INSERT、MERGE和UPDATE语句禁用并行DML。当使用ALTER session ENABLE parallel DML语句为会话启用并行DML时,可以使用此提示为单个语句禁用并行DML。
PARALLEL从Oracle Database 11g Release 2开始,PARALLEL和NO_PARALLEL提示是语句级提示,并取代早期的对象级提示:PARALLEL_INDEX、NO_PARALLEL_INDEX和以前指定的PARALLLE和NO_PRALLEL提示。对于PARALLEL,如果指定整数,则该并行度将用于该语句。如果省略整数,则数据库将计算并行度。所有可以使用并行的访问路径都将使用指定或计算的并行度。PARALLEL提示指示优化器使用指定数量的并发服务器进行并行操作。此提示覆盖PARALLEL_DEGREE_POLICY初始化参数的值。它应用于语句的SELECT、INSERT、MERGE、UPDATE和DELETE部分,以及表扫描部分。如果违反了任何并行限制,则忽略提示。对于语句级PARALLEL提示:•PARALLEL:语句导致的并行度等于或大于计算的并行度,除非并行对于最低成本计划不可行。当并行不可行时,语句以串行方式运行。•PARALLEL(默认):优化器计算的并行度等于所有参与实例上可用的CPU数乘以PARALLEL_THREADS_PER_CPU初始化参数的值。•并行(自动):语句产生的并行度等于或大于计算的并行度,除非并行对于最低成本计划不可行。当并行不可行时,语句以串行方式运行。•并行(手动):优化器被强制使用语句中对象的并行设置。•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:查询协调器应检查初始化参数的设置,以确定默认的并行度。•PARALLEL(integer):优化器使用由integer指定的并行度。•PARALLEL(默认):优化器计算的并行度等于所有参与实例上可用的CPU数乘以PARALLEL_THREADS_PER_CPU初始化参数的值。在下面的示例中,PARALLEL提示覆盖雇员表定义中指定的并行度:SELECT /*+ FULL(hr_emp) PARALLEL(hr_emp, 5) / last_name FROM employees hr_emp;在下一个示例中,PARALLEL提示覆盖雇员表定义中指定的并行度,并指示优化器计算并行度,该并行度等于所有参与实例上可用的CPU数乘以PARALLEL_THREADS_PER_CPU初始化参数的值。SELECT /+ FULL(hr_emp) PARALLEL(hr_emp, DEFAULT) */ last_name FROM employees hr_emp;
NO_PARALLELNO_PARALLEL提示指示优化器串行运行该语句。此提示覆盖PARALLEL_DEGREE_POLICY初始化参数的值。它还覆盖DDL中创建或更改表的PARALLEL参数ALTER TABLE employees PARALLEL 8; SELECT /*+ NO_PARALLEL(hr_emp) */ last_name FROM employees hr_emp;
PARALLEL_INDEXPARALLEL_INDEX提示指示优化器使用指定数量的并发服务器来并行化分区索引的索引范围扫描、完整扫描和快速完整扫描。整数值表示指定索引的并行度。指定DEFAULT或不指定值表示查询协调器应检查初始化参数的设置,以确定默认的并行度。SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */ from table1指示将使用三个并行执行进程
NO_PARALLEL_INDEXNO_PARALLEL_INDEX提示覆盖DDL中创建或更改索引的PARALLEL参数,从而避免并行索引扫描操作。
PQ_CONCURRENT_UNIONPQ_CONCURRENT_UNION提示指示优化器启用UNION和UNION ALL操作的并发处理。
NO_PQ_CONCURRENT_UNIONNO_PQ_CONCURRENT_UNION提示指示优化器禁用UNION和UNION ALL操作的并发处理。
PQ_DISTRIBUTEPQ_DISTRIBUTE提示指示优化器如何在生产者和消费者查询服务器之间分配行。您可以控制连接或加载的行的分布。详情看官网文档
PQ_FILTERPQ_FILTER提示指示优化器在筛选相关子查询时如何处理行。 •SERIAL:连续处理过滤器左侧和右侧的行。当并行化的开销对于查询太高时,例如,当左侧只有很少的行时,请使用此选项。•NONE:在过滤器的左侧和右侧并行处理行。当筛选器左侧的数据分布没有歪斜,并且您希望避免左侧的分布时,例如,由于左侧的大尺寸,请使用此选项。•HASH:使用哈希分布并行处理过滤器左侧的行。在筛选器的右侧连续处理行。当筛选器左侧的数据分布没有歪斜时,请使用此选项。 •RANDOM:使用随机分布并行处理过滤器左侧的行。在筛选器的右侧连续处理行。当筛选器左侧的数据分布存在偏差时,请使用此选项。
PQ_SKEWPQ_SKEW提示建议优化器并行联接的联接键的值的分布高度扭曲,即高百分比的行具有相同的联接键值。表秒中指定的表是哈希连接的探测表。
NO_PQ_SKEWNO_PQ_SKEW提示建议优化器并行联接的联接键的值的分布不会扭曲,即,很高比例的行不具有相同的联接键值。表秒中指定的表是哈希连接的探测表。
Online Application Upgrade HintsCHANGE_DUPKEY_ERROR_INDEXCHANGE_DUPKEY_ERROR_INDEX提示提供了一种机制,用于明确标识指定列集或指定索引的唯一键冲突。当指定索引发生唯一键冲突时,将报告ORA-38911错误,而不是ORA-001。此提示适用于INSERT、UPDATE操作。如果指定索引,则索引必须存在并且唯一。如果指定列列表而不是索引,则其列在数量和顺序上与指定列匹配的唯一索引必须存在。
IGNORE_ROW_ON_DUPKEY_INDEXIGNORE_ROW_ON_DUPKEY_INDEX提示仅适用于单表INSERT操作。它不支持UPDATE、DELETE、MERGE或多表插入操作。IGNORE_ROW_ON_DUPKEY_INDEX导致语句忽略指定列集或指定索引的唯一键冲突。当遇到唯一键冲突时,将发生行级回滚,并使用下一个输入行继续执行。如果在启用DML错误记录的情况下插入数据时指定此提示,则不会记录唯一键冲突,并且不会导致语句终止。如果违反特定规则,则此提示的语义效果将导致错误消息:•如果指定索引,则索引必须存在并且唯一。否则,该语句会导致ORA-38913。•必须正好指定一个索引。如果未指定索引,则该语句将导致ORA-38912。如果指定多个索引,则该语句将导致ORA-38915。•可以在INSERT语句中指定CHANGE_DUPKEY_ERROR_INDEX或IGNORE_ROW_ON_DUPKEY_INDEX.但不能同时指定这两个提示。如果同时指定这两者,则该语句将导致ORA-38915。
RETRY_ON_ROW_CHANGE此提示仅对UPDATE和DELETE操作有效。INSERT或MERGE操作不支持它。指定此提示时,当集合中一个或多个行的ORA_ROWSCN从确定要修改的行集合到实际修改块的时间发生变化时,将重试该操作。
Query Transformation HintsFACTFACT提示用于星形转换的上下文中。它指示优化器将表秒中指定的表视为事实表。
NO_FACTNO_FACT提示用于星形转换的上下文中。它指示优化器不应将查询的表视为事实表。
MERGEMERGE提示允许在查询中合并视图。如果视图的查询块在SELECT列表中包含GROUP BY子句或DISTINCT运算符,则仅当启用复杂视图合并时,优化器才能将视图合并到访问语句中。如果子查询不相关,则复杂合并也可以用于将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与视图名称一起用作参数时,它应该放在周围的查询中。
NO_MERGENO_MERGE提示指示优化器不要将外部查询和任何内联视图查询组合到单个查询中。此提示允许您对访问视图的方式有更多的影响。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_EXPANDNO_EXPAND提示指示优化器不要为WHERE子句中具有OR条件或IN列表的查询考虑OR扩展。通常,优化器考虑使用OR扩展,并在确定成本低于不使用它时使用该方法。SELECT /*+ NO_EXPAND */ * FROM employees e, departments d WHERE e.manager_id = 108 OR d.department_id = 110;
USE_CONCATSELECT /*+ USE_CONCAT */ * FROM employees e WHERE manager_id = 108 OR department_id = 110;USE_CONCAT提示指示优化器使用UNION ALL集合运算符将查询的WHERE子句中的组合OR条件转换为复合查询。没有这个提示,只有当使用连接的查询的成本比没有连接的成本便宜时,才会发生这种转换。USE_CONCAT提示覆盖成本考虑。
REWRITEREWRITE提示指示优化器尽可能根据物化视图重写查询,而不考虑成本。在有或没有视图列表的情况下使用REWRITE提示。如果对视图列表使用REWRITE,并且该列表包含合格的物化视图,则Oracle将使用该视图,而不考虑其成本。Oracle不考虑列表之外的视图。如果不指定视图列表,则Oracle将搜索合格的物化视图,并始终使用它,而不管最终计划的成本如何。
NO_REWRITENO_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;
UNNESTUNNEST提示指示优化器卸载子查询的主体,并将其合并到包含它的查询块的主体中,从而允许优化器在评估访问路径和联接时将它们一起考虑。第2章注释2-138在取消子查询之前,优化器首先验证语句是否有效。然后,该语句必须通过启发式和查询优化测试。UNNEST提示指示优化器仅检查子查询块的有效性。如果子查询块有效,则启用子查询卸载,而不检查启发或成本。
NO_UNNEST使用NO_UNNEST提示可以关闭不需要的功能。
STAR_TRANSFORMATIONSTAR_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’;即使指定了提示,也不能保证转换会发生。优化器仅在看起来合理的情况下生成子查询。如果没有生成子查询,则没有转换的查询,并且使用未转换查询的最佳计划,而不管提示如何。
NO_STAR_TRANSFORMATIONNO_STAR_TRANSFORMATION提示指示优化器不要执行星型查询转换。
NO_QUERY_TRANSFORMATIONNO_QUERY_TRANSFORMATION提示指示优化器跳过所有查询转换,包括但不限于OR扩展、视图合并、子查询卸载、星形转换和物化视图重写。SELECT /*+ NO_QUERY_TRANSFORMATION */ employee_id, last_name FROM (SELECT * FROM employees e) v WHERE v.last_name = ‘Smith’;
XML HintsNO_XMLINDEX_REWRITENO_XMLINDEX_REWRITE提示指示优化器不要对当前查询使用任何XMLINDEX索引。SELECT /+NO_XMLINDEX_REWRITE/ count(*) FROM warehouses WHERE existsNode(warehouse_spec, ‘/Warehouse/Building’) = 1;
NO_XML_QUERY_REWRITENO_XML_QUERY_REWRITE提示指示优化器禁止重写SQL语句中的XPath表达式。通过禁止重写XPath表达式,该提示还禁止对当前查询使用任何XMLIndex。SELECT /+NO_XML_QUERY_REWRITE/ XMLQUERY(‘’ RETURNING CONTENT) FROM DUAL;
Other HintsAPPENDAPPEND提示指示优化器将直接路径INSERT与INSERT语句的子查询语法一起使用。•常规INSERT是串行模式下的默认值。在串行模式下,仅当包含APPEND提示时,才能使用直接路径。•直接路径INSERT是并行模式中的默认值。在并行模式下,仅当指定NOAPPEND提示时,才能使用常规插入。INSERT是否并行的决定与APPEND提示无关。第2章注释2-98在直接路径INSERT中,数据被追加到表的末尾,而不是使用当前分配给表的现有空间。因此,直接路径INSERT比传统INSERT快得多。APPEND提示仅受INSERT语句的子查询语法支持,而不受VALUES子句支持。如果使用VALUES子句指定APPEND提示,则将忽略它,并使用常规插入。要将直接路径INSERT与VALUES子句一起使用,请参阅“APPEND_VALUES提示”。
APPEND_VALUESAPPEND_VALUES提示指示优化器对VALUES子句使用直接路径INSERT。如果不指定此提示,则使用传统的INSERT。在直接路径INSERT中,数据被追加到表的末尾,而不是使用当前分配给表的现有空间。因此,直接路径INSERT比传统INSERT快得多。APPEND_VALUES提示可用于大大提高性能。它的一些用法示例是:•在Oracle调用接口(OCI)程序中,当使用大型数组绑定或数组绑定与行回调时•在PL/SQL中,当用具有带VALUES子句的INSERT语句的FORALL循环加载大量行时,APPEND_VALUES提示仅受INSERT声明的VALUES语句支持。如果使用INSERT语句的子查询语法指定APPEND_VALUES提示,则会忽略它,并使用常规插入。要对子查询使用直接路径INSERT,请参阅“APPEND提示”。
NOAPPENDNOAPPEND提示通过在INSERT语句期间禁用并行模式,指示优化器使用传统的INSERT。常规INSERT是串行模式下的默认值,而直接路径INSERT则是并行模式下的缺省值。NOAPPEND提示指示优化器使用常规INSERT,即使在并行模式下执行INSERT也是如此。
CACHECACHE提示指示优化器在执行全表扫描时,将为表检索的块放在缓冲区缓存中LRU列表的最近使用的末尾。此提示对于小型查找表很有用SELECT /*+ FULL (hr_emp) CACHE(hr_emp) */ last_name FROM employees hr_emp;CACHE和NOCACHE提示影响系统统计信息表扫描(长表)和表扫描(短表),如V$SYSSTAT数据字典视图中所示
NOCACHENOCACHE提示指示优化器在执行全表扫描时,将从表中检索到的块放在缓冲缓存中LRU列表中最近最少使用过的位置SELECT /*+ FULL(hr_emp) NOCACHE(hr_emp) */ last_name FROM employees hr_emp;CACHE和NOCACHE提示影响系统统计信息表扫描(长表)和表扫描(短表),如V$SYSSTAT视图中所示。
CONTAINERSCONTAINERS提示在多租户容器数据库(CDB)中很有用。可以在包含CONTAINERS()子句的SELECT语句中指定此提示。这样的语句允许您跨CDB或应用程序容器中的所有容器查询指定表或视图中的数据。第2章注释2-101•要查询CDB中的数据,您必须是连接到CDB根目录的普通用户,并且表或视图必须存在于根目录和所有PDB中。查询返回CDB根目录和所有打开的PDB中的表或视图中的所有行。•要查询应用程序容器中的数据,您必须是连接到应用程序根的公共用户,并且表或视图必须存在于应用程序根中,并且应用程序容器的所有PDB中。该查询返回应用程序根目录中的表或视图以及应用程序容器中所有打开的PDB中的所有行。包含CONTAINERS()子句的语句在每个查询的PDB中生成和执行递归SQL语句。您可以使用CONTAINERS提示将默认PDB提示传递给每个递归SQL语句。对于提示,可以指定适用于SELECT语句的任何SQL提示。SELECT /*+ CONTAINERS(DEFAULT_PDB_HINT=‘NO_PARALLEL’) / (CASE WHEN COUNT() < 10000 THEN ‘Less than 10,000’ ELSE ‘10,000 or more’ END) “Number of Tables” FROM CONTAINERS(DBA_TABLES);
CURSOR_SHARING_EXACTOracle可以在安全的情况下用绑定变量替换SQL语句中的文字。此替换由CURSOR_SHARING初始化参数控制。CURSOR_SHARING_EXACT提示指示优化器关闭此行为。当您指定此提示时,Oracle将执行SQL语句,而不会尝试替换文本
DRIVING_SITEDRIVING_SITE提示指示优化器在与数据库选择的站点不同的站点执行查询。如果您正在使用分布式查询优化,此提示非常有用。SELECT /*+ DRIVING_SITE(departments) */ * FROM employees, departments@rsite WHERE employees.department_id = departments.department_id;如果在没有提示的情况下执行此查询,则部门的行将被发送到本地站点,并在那里执行连接。有了提示,员工的行被发送到远程站点,查询在那里执行,结果集返回到本地站点。
DYNAMIC_SAMPLINGDYNAMIC_SAMPLING提示指示优化器如何控制动态采样,以通过确定表和索引的更准确的谓词选择性和统计信息来提高服务器性能。可以将DYNAMIC_SAMPLING的值设置为0到10之间的值。级别越高,编译器在动态采样中投入的精力就越多,并且应用得越广泛。除非指定表秒,否则采样默认为游标级别。整数值为0到10,表示采样程度。如果表的基数统计已经存在,则优化器使用它。否则,优化器启用动态采样来估计基数统计。•如果存在单个表谓词,则优化器使用现有基数统计信息,并使用现有统计信息估计谓词的选择性。要将动态采样应用于特定表,请使用以下形式的提示:SELECT /*+ DYNAMIC_SAMPLING(employees 1) */ * FROM employees WHERE …如果指定表秒,并且基数统计已经存在,则:•如果没有单个表谓词(仅计算一个表的WHERE子句),则优化器信任现有的统计信息,并忽略此提示。例如,如果分析员工,则以下查询不会导致任何动态采样:SELECT /*+ DYNAMIC_SAMPLING(e 1) / count() FROM employees e;
FRESH_MVFRESH_MV提示在查询实时物化视图时应用。此提示指示优化器在查询计算中使用,以从物化视图中获取最新数据,即使物化视图已过时。优化器在查询不是实时物化视图的对象的SELECT语句块中,以及在所有UPDATE、INSERT、MERGE和DELETE语句块中忽略此提示。
GATHER_OPTIMIZER_STATISTICSGATHER_OPTIMIZER_STATISTICS提示指示优化器在以下类型的批量加载期间启用统计信息收集:• CREATE TABLE … AS SELECT • INSERT INTO … SELECT into an empty table using a direct-path insert
NO_GATHER_OPTIMIZER_STATISTICSNO_GATHER_OPTIMIZER_STATISTICS提示指示优化器在以下类型的批量加载期间禁用统计信息收集:• CREATE TABLE AS SELECT • INSERT INTO … SELECT into an empty table using a direct path insert 。NO_GATHER_OPTIMIZER_STATISTICS提示适用于传统负载。如果在传统的insert语句中指定了该提示,Oracle将遵守该提示,而不会收集实时统计信息。
GROUPINGGROUPING提示适用于对分区模型进行评分时的数据挖掘评分函数。该提示导致将输入数据集划分为不同的数据片,以便在前进到下一个分区之前对每个分区进行完整的评分;然而,按分区并行仍然可用。数据切片由构建模型时使用的分区键列确定。该方法可以与针对分区模型的任何数据挖掘函数一起使用。当对与许多分区关联的大数据进行评分时,该提示可能会产生查询性能提高,但当对大型系统上具有较少分区的大数据评分时,可能会对性能产生负面影响。通常,如果将此提示用于单行查询,则不会提高性能。SELECT PREDICTION(/*+ GROUPING */my_model USING *) pred FROM <input table>;
MODEL_MIN_ANALYSISMODEL_MIN_ANALYSIS提示指示优化器省略电子表格规则的一些编译时优化,主要是详细的依赖关系图分析。优化器仍在使用其他电子表格优化,例如创建筛选器以有选择地填充电子表格访问结构和有限的规则修剪。此提示减少了编译时间,因为如果电子表格规则的数量超过几百条,则电子表格分析可能会很长。
MONITORMONITOR提示强制对查询进行实时SQL监视,即使语句没有长时间运行。仅当参数CONTROL_MANAGEMENT_PACK_ACCESS设置为DIAGNOSTIC+TUNING时,此提示才有效。
NO_MONITORNO_MONITOR提示禁用查询的实时SQL监视,即使查询是长时间运行的。
OPT_PARAMOPT_PARAM提示允许您仅为当前查询的持续时间设置初始化参数。此提示仅对以下参数有效:APPROX_for_AGGREGATION、APPROX_SOR_COUNT_DISTINCT、APPROX-for_PERCENTILE、OPTIMIZER_DYNAMIC_SAMPLING、OPTINIZER_INDEX_CACHING、OPTIFIZER_INDEX_COST_ADJ和STAR_TRANSFORMATION_ENABLED。SELECT /*+ OPT_PARAM(‘star_transformation_enabled’ ‘true’) */ * FROM … ;字符串参数值包含在单引号中。指定数字参数值时没有引号。
PUSH_PREDPUSH_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;
NO_PUSH_PREDNO_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;
PUSH_SUBQPUSH_SUBQ提示指示优化器在执行计划中尽可能早的步骤评估未合并的子查询。通常,未合并的子查询作为执行计划中的最后一步执行。如果子查询相对便宜,并且显著减少了行数,那么更早地评估子查询可以提高性能。如果子查询应用于远程表或使用合并联接联接的表,则此提示无效。
NO_PUSH_SUBQNO_PUSH_SUBQ提示指示优化器评估未合并的子查询,作为执行计划中的最后一步。如果子查询的开销相对较大或不能显著减少行数,则这样做可以提高性能。
PX_JOIN_FILTER此提示强制优化器使用并行连接位图过滤。
NO_PX_JOIN_FILTER此提示防止优化器使用并行联接位图筛选
QB_NAME使用QB_NAME提示定义查询块的名称。然后,可以在外部查询的提示中使用该名称,甚至在内联视图的提示中,以影响对命名查询块中出现的表的查询执行。如果两个或多个查询块具有相同的名称,或者如果相同的查询块用不同的名称提示了两次,则优化器将忽略引用该查询块的所有名称和提示。未使用此提示命名的查询块具有唯一的系统生成名称。这些名称可以显示在计划表中,也可以在查询块内的提示或查询块提示中使用。SELECT /*+ QB_NAME(qb) FULL(@qb e) */ employee_id, last_name FROM employees e WHERE last_name = ‘Smith’;

持续完善中……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值