oracle 中 /*+ full(表名)*/ 优化详解

hint 关键字: /+ full(表名)/

  • 一般来说,sql 优化时,尽量走 index,但不绝对
  • 有时候,全表扫描的效率比索引高
'索引''全表扫描' 的区别:
1. '索引' 就是 '目录',一本词典使用 '目录' 查字会块些
2. 但是若只有两页还是一眼扫过去更快些

如果玩过 LOL 这种游戏,也可以理解为
如果你距离血池就 5 码的距离,你还会选择回城吗?肯定是走过去更快些啦~

实际应用:

  • 当查询 sql 时间范围较长时
  • 当 sql 中使用索引(执行计划),还是查询很慢时

说明:

表名
	(1) 若表有 '别名',则是 '别名'
	(2) 若表没有 '别名',则是 '表名' 全称

示例:

SELECT /*+ full(t)*/
       *
  FROM scott.emp t
 WHERE t.empno >= 1

在这里插入图片描述

可能遇到的问题

别名为 “@SELxx”

SQL> select * from table(dbms_xplan.display_cursor(sql_id => 'bsdw1ur9qw6mv',cursor_child_no => 0,format => 'advanced'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  bsdw1ur9qw6mv, child number 0
-------------------------------------
SELECT *   FROM scott.emp t  WHERE t.empno >= 1
Plan hash value: 169057108
--------------------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost (%CPU)| Time
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |       |       |     2 (100)|
|   1 |  TABLE ACCESS BY INDEX ROWID| EMP    |    14 |   532 |     2   (0)| 00:0
|*  2 |   INDEX RANGE SCAN          | PK_EMP |    14 |       |     1   (0)| 00:0
--------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / T@SEL$1
   2 - SEL$1 / T@SEL$1
PLAN_TABLE_OUTPUT

解释:

1. T : 表别名
2. @SETL$1 数据块别名

说明:我们一般只需要关注 '表别名' 即可。
	 '数据块别名' Oracle 系统自行维护

猜你喜欢

转载自blog.csdn.net/qq_34745941/article/details/97259853