Oracle所有执行计划关键词 + 所有hint

执行计划里面的关键词

TABLE ACCESS FULL —全表扫描
TABLE ACCESS STORAGE FULL ------table access full和TABLE ACCESS STORAGE FULL都是指全表扫描,但它们之间有一些区别。table access full表示Oracle需要读取整个表的所有块,而table access storage full表示Oracle需要读取整个表的所有块和行。因此,table access storage full比table access full更消耗资源,更慢。
TABLE ACCESS BY USER ROWID----ROWID 扫描下面详细讲解
TABLE ACCESS BY USER ROWID:
含义:使用用户行标识(USER ROWID)从表中访问数据。
适用场景:当没有使用索引或无法使用索引进行访问时,将使用此方法进行全表扫描。对于小表或需要访问表中大部分数据的查询,这种方法可能会比较有效。
TABLE ACCESS BY INDEX ROWID:
含义:使用索引行标识(INDEX ROWID)通过索引访问数据。
适用场景:当查询条件能够通过索引进行匹配时,使用此方法可通过索引直接访问所需的数据。对于大表或需要访问表中少量数据的查询,这种方法可能会比进行全表扫描更高效。
TABLE ACCESS BY INDEX ROWID BATCHED:
含义:使用索引行标识(INDEX ROWID)批量通过索引访问数据。
适用场景:当查询需要通过索引访问并返回大量结果时,使用此方法可以一次性获取多个行的数据,从而提高访问效率。这在批量查询或需要频繁访问索引的情况下特别有用。
TABLE ACCESS BY LOCAL INDEX ROWID BATCHED:
含义:使用本地索引行标识(LOCAL INDEX ROWID)批量通过索引访问数据。
适用场景:当多个索引键值位于相同分区的分区表上时,使用此方法可以通过本地索引行标识一次性获取多个行的数据。这种方法适用于需要根据分区键值快速访问表数据的查询。
TABLE ACCESS BY GLOBAL INDEX ROWID:
含义:使用全局索引行标识(GLOBAL INDEX ROWID)通过索引访问数据。
适用场景:当查询需要通过全局索引行标识访问表数据时,使用此方法。这种方法适用于非分区表或多个索引键值位于不同分区的分区表。
UNION ALL PUSHED PREDICATE---------表示将谓词从UNION ALL操作处推送到各个子查询的优化技术。它在执行计划中可以减少谓词的数量,提高查询性能。
FIXED TABLE FULL —意味着查询优化器将直接从一个称为"固定表”(Fixed Table)的内部数据结构中读取数据
FIXED TABLE FIXED INDEX—它指示查询优化器直接从固定表(系统表)的特定索引中获取数据,而不是使用常规的索引扫描或全表扫描。
COUNT STOPKEY----操作步骤用于计算满足查询条件的记录的数量。它使用一个停止键的机制,当计数达到指定的数量时就停止计算,不再扫描剩余的数据。
REMOTE —有使用dblink查询,dblink很慢,如果数据量大,最好创建分布视图(跟试图一样)
INDEX UNIQUE SCAN —索引唯一扫描
INDEX FAST FULL SCAN --索引快速全表扫描
INDEX SKIP SCAN --索引跳跃式扫描
INDEX RANGE SCAN—索引范围扫描
PARTITION LIST ALL ------分区列表全表扫描
PARTITION RANGE ALL-----分区范围全表扫描
PARTITION LIST SINGLE ------使用分区列表单值(partition list single)方法来访问分区表。
PARTITION RANGE SINGLE-----使用分区范围单值(Partition Range Single)方法来访问分区表。
SORT JOIN 和MERGE JOIN --排序合并连接 /+MERGE_SJ/
NESTED LOOPS --嵌套合并连接
HASH JOIN --哈希连接
ANTI(HASH JOIN ANTI 和MERGE JOIN ANTI 和NESTED LOOPS ANTI) --反连接
SEMI (HASH JOIN SEMI 和MERGE JOIN SEMI和NESTED LOOPS SEMI )–半连接/+ NL_SJ/
INDEX JOIN --在执行计划中对应的关键字和普通的表连接一样,只不过参与的连接对应是索引
FILTER --过滤的意思一般出现在执行计划的最下面
SORT(SORT AGGREGATE 和SORT UNIQUE 和SORT JOIN 和SORT GROUP BY 和SORT ORDER BY 和BUFFER SORT ) --排序
CONCAT(CONCATENATION) —IN-List 扩展或 OR扩展/+USE_CONCAT/
LOAD TABLE CONVENTIONAL—常规路径插入
LOAD AS SELECT —加/+APPEND/可以直接路径插入
/+PARALLEL(table,)/–如果没有指定并行度,则ORACLE会默认并行度。
/+NO_PARALLEL(table)/–对该hint中指定的表不使用并行访问
/+PARALLEL_INDEX(table,[index,[degree]])/–对该hint 中指定的分区索引以指定的并行做扫描
/+NO_PARALLEL_INDEX(table,[index])/–对该hint中指定的分区索引不使用并行访问。
/+PQ_DISTRIBUTE(table,out,in)/–对该hint中指定的表以out/in所指定的方式来传递数据,这里的out/in 的值可以是HASH/NONE/BROADCAST/PARTITION中的任意一种

与优化器模式相关的hint:
/+ ALL_ROWS/ —强制启用CBO优化器并选择最优的执行路径 Oracle10G开始ALL_ROWS就是默认优化器模式
/+ FIRST_ROWS(10)/—强制启用CBO优化器,并且依据返回头N条记录的响应时间来决定目标sql的执行计划。(10)意思是选择最快的执行路径显示前10条数据,如果展示全表数据,不保证能最快。10可以在后台默认设置成1,10,100,1000 ,如果是update delete 使用会被忽略,不起作用。
/+ RULE/ —强制使用RBO优化器执行sql,最好单独使用,与其他hint连用时很可能全部失效。如果使用的sql中表里面有分区表,单独使用/+ RULE/ 也会失效。

与表访问相关的hint:
/+FULL(目标表)/ —强制走目标表全表扫描,不走索引。
/+ROWID(目标表)/ —强制走目标表ROWID扫描,只有目标sql中使用了含ROWID的where条件时才有意义。比如: select /+ROWID(emp)/ * from emp where rowid =‘AAAR3sAAEAAACXAA’;

与索引访问相关的hint:
格式1:/+INDEX(目标表 )/
格式2:/+INDEX(目标表 目标索引)/
格式3:/+INDEX(目标表 目标索引1 目标索引2 目标索引n)/
格式4:/+INDEX(目标表 目标索引1 的索引列名 目标索引2的索引列名 目标索引3的索引列名 )/
格式1:/+NO_INDEX(目标表 )/
格式2:/+NO_INDEX(目标表 目标索引)/
格式3:/+NO_INDEX(目标表 目标索引1 目标索引2 目标索引n)/
----优化器不对目标表上的目标索引执行索引扫描操作。
/+INDEX_DESC(目标表 目标索引)/—按照降序方式进行索引扫描,特别是当需要按降序方式进行排序或过滤时使用更加。
格式1:/+INDEX_FFS(目标表 )/
格式2:/+INDEX_FFS(目标表 目标索引)/
格式3:/+INDEX_FFS(目标表 目标索引1 目标索引2 目标索引n)/—索引快速全扫描能成立的前提条件是SELECT语句中所有查询列都存在于目标索引中,即通过扫描目标索引就可以得到所有的查询列而不用回表。
格式1:/+INDEX_JOIN(目标表 )/
格式2:/+INDEX_JOIN(目标表 目标索引1 目标索引2 目标索引n)/—INDEX_JOIN能成立的前提条件是SELECT语句中所有查询列都存在于目标表上的多个目标索引中,即通过扫描目标索引就可以得到所有的查询列而不用回表。
/+AND_EQUAL(目标表 目标索引1 目标索引2 目标索引n)/—让优化器强制对目标表上的多个目标索引执行INDEX MERGE操作。INDEX MERGE能成立的前提条件是目标sql的where条件里出现了多个针对不同单列的等值条件,并且这些列上都有单键值的索引。另外,在Oracle数据库里,能做INDEX MERGE的索引数量的最大值是5。

与表连接顺序相关的hint:
/+ORDERED /—是针对多张表关联的sql,优化器会按照sql中的from后面出现的顺序从左到右依次进行连接。
/
+LEADING (目标表1 目标表2 目标表n)
/—按照hint编写顺序作为目标sql表连接过程中的驱动结果集,并从左到右出现的第一个目标表作为整个表连接过程中的首个驱动表。

与表连方法相关的hint:
格式1:/+USE_MERGE(目标表)/
格式2:/+USE_MERGE(目标表1 目标表2 目标表n)/ —优化器将我们指定的多个表作为被驱动表于其他表或者结果集做排序合并连接。在USE_METER 中指定的目标表应该是排序合并连接中的被驱动表,如果指定的表并不能作为排序合并连接的被驱动表,则此时Oracle要么会忽略该USE_MERGE ,要么会忽略该表。正因为Oracle可能会忽略USE_MERGE 或者忽略在USE_MERGE中指定的被驱动表,所以我们通常会用LEADING或者ORDERED 配合USE_MERGE一起使用,以让优化器走出我们想要的执行计划。
/+NO_USE_MERGE(目标表)/----和USE_MERGE是反义词,也要和LEADING或者ORDERED配合使用,不然很又可能会被Oracle忽略。
/+USE_NL(目标表1 目标表2 目标表n)/—优化器将我们指定的多个表作为被驱动表于其他表或者结果集做嵌套循环连接。在USE_NL 中指定的目标表应该是嵌套循环中的被驱动表,如果指定的表并不能作为嵌套循环连接的被驱动表,则此时Oracle要么会忽略该USE_NL ,要么会忽略该表。正因为Oracle可能会忽略USE_NL 或者忽略在USE_NL中指定的被驱动表,所以我们通常会用LEADING或者ORDERED 配合USE_NL一起使用,以让优化器走出我们想要的执行计划。
/+NO_USE_NL(目标表)/----和USE_NL是反义词,也要和LEADING或者ORDERED配合使用,不然很又可能会被Oracle忽略。
/+USE_HASH(目标表)/—优化器将我们指定的多个表作为被驱动表于其他表或者结果集做嵌套循环连接。在USE_HASH中指定的目标表应该是嵌套循环中的被驱动表,如果指定的表并不能作为嵌套循环连接的被驱动表,则此时Oracle要么会忽略该USE_HASH ,要么会忽略该表。正因为Oracle可能会忽略USE_HASH 或者忽略在USE_HASH中指定的被驱动表,所以我们通常会用LEADING或者ORDERED 配合USE_HASH一起使用,以让优化器走出我们想要的执行计划。
/+NO_USE_HASH(目标表)/----和USE_NL是反义词,也要和LEADING或者ORDERED配合使用,不然很又可能会被Oracle忽略。
/+MERGE_AJ/ ----针对子查询的hint ,对相关目标表执行排序合并反连接,在子查询里面使用。
/+MERGE_SJ/ ----针对子查询的hint ,对相关目标表执行排序合并半连接,在子查询里面使用。
/+NL_AJ/ ----针对子查询的hint ,对相关目标表执行嵌套循环反连接,在子查询里面使用。
/+NL_SJ/ ----针对子查询的hint ,对相关目标表执行嵌套循环半连接,在子查询里面使用。
/+HASJ_AJ/ ----针对子查询的hint ,对相关目标表执行哈希反连接,在子查询里面使用。
/+HASJ_SJ/ ----针对子查询的hint ,对相关目标表执行哈希半连接,在子查询里面使用。

与查询转换相关的hint:
/+USE_CONCAT/ —是针对整个目标sql的hint ,它会让优化器对目标sql使用IN_List 扩展
或者OR扩展。
/+NO_EXPAND/ —是针对整个目标sql的hint ,它是USE_CONCAT的反义hint,其含义是不让优化器对目标sql使用IN_List 扩展或者OR扩展。
/+MERGE(目标试图)/—是针对单个试图的hint ,它的含义就是让优化器对目标试图执行试图合并 。
/+NO_MERGE(目标试图)/—是MERGE的反义hint,它的含义就是让优化器不对目标试图执行试图合并 。
/+UNNEST/ ----是针对子查询的hint ,对目标sql中的子查询执行子查询展开。
/+NO_UNNEST/ ----是 UNNEST的反义hint ,不让目标sql中的子查询执行子查询展开。
/+EXPAND_TABLE/ ----是针对单个目标表的hint,在不考虑成本的情况下,对目标sql中的目标表执行表扩展。
/+NO_EXPAND_TABLE/ ----是 EXPAND_TABLE的反义hint ,不让目标sql中的目标表执行表扩展。

与并行相关的hint:
新的写法:
格式1:/+PARALLEL/ --Oracle自动计算并行度,这个并行度总是大于或者等于2
格式2:/+PARALLEL(AUTO)/ --Oracle自动计算并行度,这个并行度可能是1,所以当是1的时候sql就是串行。
格式3:/+PARALLEL(MANUAL)/ --会通过相关对象并行度的设置来开启并行,可能是1
格式4:/+PARALLEL(指定的并行度)/ —根据手动设置并行度开启并行。
旧的写法:
格式1:/+PARALLEL(目标表 指定的并行度)/ —给指定目标表开启指定的并行度。
格式2:/+PARALLEL(目标表 DEFAULT)/ —根据相关系统表计算出来默认并行度执行访问目标表。
/+NO_PARALLEL/ —不使用并行。

/+PARALLEL_INDEX(目标表 DEFAULT)/—针对单个表的hint,以指定或者系统计算出来的并行度去对目标表上的目标分区索引执行并行索引扫描。
格式1:/+PARALLEL_INDEX(目标表 目标分区索引 指定的并行度)/
格式2:/+PARALLEL_INDEX(目标表 目标分区索引 DEFAULT)/
格式3:/+PARALLEL_INDEX(目标表 目标分区索引 1 目标分区索引 2 目标分区索引 n)/
格式4:/+PARALLEL_INDEX(目标表 目标分区索引 1 目标分区索引 2 目标分区索引 n DEFAULT DEFAULT DEFAULT ) /
格式5:/
+PARALLEL_INDEX(目标表 )
/
/+NO_PARALLEL_INDEX(目标表 DEFAULT)/—针对单个表的hint,跟PARALLEL_INDEX是反义hint

其他常见的hint:
/+DRIVING_SITE(目标表)/----针对单个目标表的hint,优化器在我们指定的目标表所在的节点上执行目标sql,仅适用于带dblink的分布式查询语句,DRIVING_SITE不能用于分布式DML或者DDL语句。
/+APPEND/—针对整个目标sql的hint,执行带子查询INSERT语句时绕开Buffer Cache ,使用直接路径插入(Direct-path INSERT)会直接在目标表的高水位线以上插入数据(最后抬高高水位线),insert 默认是常规插入(Conventional INSERT),在Oracle 11GR2开始APPEND对带有VALUES的insert是无效的但是有个hint /+APPEND_VALUES/专用于带有VALUES的insert的语句,使用APPEND_VALUES时候Oracle会在目标表加上LMODE=6的排他锁。
/+PUSH_PRED(目标视图)/----针对目标视图的hint,让目标视图执行连接谓词推入,如果写在子查询里面格式就是/+PUSH_PRED/不用写目标视图。
/+NO_PUSH_PRED(目标视图)/----针对目标视图的hint,让目标视图不去执行连接谓词推入。
/+PUSH_SUBQ/----针对子查询的hint ,让优化器尽可能早地执行目标sql中不能做子查询展开的子查询,通常情况,目标sql中不能做子查询展开的子查询总是在执行计划的最后一步才被执行,但如果执行这个子查询后能显著减少返回结果集的数量,则先执行这个子查询就可能提高该sql的执行效率。
/+NO_PUSH_SUBQ/----针对子查询的hint ,是PUSH_SUBQ的反义,是让优化器最后执行目标sql中不能做子查询展开的子查询。
/+OPT_PARAM (参数名称 参数值)/----针对整个目标sql的hint,用来修改针对目标sql的与优化器相关的一些参数,用OPT_PARAM修改的参数仅仅对它所在的目标sql有效,比修改系统和session的参数更细的一个粒度。
OPT_PARAM能修改的与优化器相关的参数有:
OPTIMIZER_INDEX_CACHING:该参数可以控制优化器在估计索引所需的块数时所使用的索引读取缓存比率。默认值为0,可以设置为介于0和100之间的值。
OPTIMIZER_INDEX_COST_ADJ:该参数允许您调整优化器在计算索引访问成本时的权重。增加该值可以鼓励优化器使用更多的索引访问路径。默认值为100,可以设置为大于100的值。
OPTIMIZER_MODE:该参数可以设置优化器的模式。常见的选项包括"All Rows"、“First Rows"和"Choose”。默认值为"Choose",允许优化器自动选择最佳的执行计划。
OPTIMIZER_DYNAMIC_SAMPLING:该参数用于控制统计信息收集的动态采样级别。可以设置为0(禁用动态采样)、1(启用动态采样)或2(启用扩展的动态采样)。
OPTIMIZER_SECURE_VIEW_MERGING:该参数决定了在优化器中是否启用安全视图(Secure View)合并优化。可以设置为TRUE或FALSE。
OPTIMIZER_USE_INVISIBLE_INDEXES:该参数决定了优化器是否考虑不可见索引(Invisible Index)作为查询执行计划的选择。可以设置为TRUE或FALSE。
optimizer_mode:用于设置优化器模式的参数。可以将其设置为常用的模式,例如"All Rows"、“First Rows”、“Rule"或"Choose”,以控制优化器在查询执行时的策略选择。
parallel_degree_policy:该参数控制并行度策略,默认值为"MANUAL"。您可以使用OPT_PARAM函数将其设置为"ADAPTIVE",以启用自适应并行度。自适应并行度策略允许Oracle根据查询工作负载自动决定并行度。
parallel_degree_limit:该参数限制每个执行计划的最大并行度。它定义了查询可以使用的最大并行度。您可以使用OPT_PARAM函数修改该参数的值来控制并行度的限制。
parallel_min_time_threshold:该参数指定触发并行查询的最小执行时间阈值。默认情况下,该参数的值为10秒。您可以使用OPT_PARAM函数修改该参数的值,以调整何时触发并行查询。
parallel_query_mode:该参数控制并行查询的模式,默认值为"MANUAL"。您可以使用OPT_PARAM函数将其设置为"AUTO",以启用自动并行查询模式。自动并行查询模式允许Oracle根据查询的复杂性和可用资源自动选择并行度。
/+OPTIMIZER_FEATURES_ENABLE (优化器的版本号)/----针对整个目标sql的hint,作用是指定数据库版本的优化器路径,只对目标sql有效,不是修改了整个系统或者session。举例:/+OPTIMIZER_FEATURES_ENABLE (‘9.2.0’)/
/+SWAP_JOIN_INPUTS(原哈希连接的被驱动表)/—针对哈希连接的hint,他是不改变原哈希连接的情况下交换哈希连接的驱动表和被驱动表,驱动表变为被驱动表,被驱动表变为驱动表,参数必须是被驱动表,不然Oracle会忽略该hint.

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值