ORACLE优化之执行规划(1) - TABLE FULL SCAN/INDEX FULL SCAN
TABLE FULL SCAN
全表扫描,表示表中所有记录都被访问到。如果表很大,
该操作对查询性能的影响会很大,此时,建议使用索引
或去掉查询中的LIKE操作。
EXPLAIN PLAN
SET statement_id = 'ex_plan1' FOR
SELECT phone_number FROM employees
WHERE phone_number LIKE '650%';
INDEX RANGE SCAN [DESCENDING] 从相关索引中获取了一个或多个ROWID。 当查询条件字段具有非唯一索引,或者查询过滤条件是一个范围, ORACLE将会采用该操作。 示例: SELECT * FROM t_employee WHERE id > 11001; SELECT * FROM t_employee WHERE first_name = 'Tommy'; 此例中,id是关键字,first_name具有非唯一索引。 oracle会对此两个索引采用INDEX RANGE SCAN. INDEX FULL SCAN [DESCENDING] 从相关的索引中获取了所有的ROWID。由于是按索引的顺序访问和获取ROWID, 因此获得的ROWID是直接排过序的。 示例1: SELECT /*+ INDEX(T_EMPLOYEE IDX_NODES_ID)*/ id from T_EMPLOYEE; 示例中使用了HINT要求强制使用索引查询,但未指定索引字段的过滤条件, 于是ORACLE将采用INDEX FULL SCAN操作。由于该操作按索引顺序或去记录, 因而返回的ID列表是排过序的。 示例2: SELECT * FROM T_EMPLOYEE WHERE MIDDLE_NAME IS NULL; 当MIDDLE_NAME字段可以为NULL,且具有非唯一索引,ORACLE在执行此语句时, 可能会采用INDEX FULL SCAN操作。 但在某些情况下,比如该语句已经执行过一遍,相关数据已经加载到内存, 那么,ORACLE的执行规划也可能会直接选择TABLE FULL SCAN操作,可能 是ORACLE认为此时直接TABLE FULL SCAN的性能会比INDEX FULL SCAN高。 INDEX FAST FULL SCAN 从相关索引中获取所有的ROWID。该操作同时从多个索引数据块中扫描数据, 所以结果并不是排序的。用于对索引字段进行查询。 示例:SELECT id FROM T_EMPLOYEE; 其中id为表的主键索引字段。 优化策略: 一般情况下,尽量避免FULL SCAN,特别是TABLE FULL SCAN和INDEX FULL SCAN. 在查询大表的情况下,INDEX RANGE SCAN会显著提高查询性能。但在查询小表时, INDEX可能反而对性能产生不利影响。