执行计划里面的关键词
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/ —不使用并行。