sql执行计划详解 oracle_sql的执行计划怎么看

sql执行计划详解 oracle_sql的执行计划怎么看ID列: 执行步骤的编号,编号越大越先执行,编号相同从上到下执行。 SELECT_TYPE列: SIMPLE:表示不需要union操作或不包含子查询的select语句,有连接查询时外层的查询寻为simple,且只有一个。 PRIMARY:表示需要union操作或包含子查询的select语句,位于最外

sql执行计划详解 oracle_sql的执行计划怎么看

ID列:

  执行步骤的编号,编号越大越先执行,编号相同从上到下执行。

SELECT_TYPE列:

  SIMPLE:表示不需要union操作或不包含子查询的select语句,有连接查询时外层的查询寻为simple,且只有一个。

  PRIMARY:表示需要union操作或包含子查询的select语句,位于最外层的查询select_type为primary,且只有一个。

  UNION:表示连接两个select查询,第一个查询时dervied派生表,之外的表都是union。

  UNION RESULT:表示包含union的结果集,再union和union all语句中,因为不参与查询,id列的值为NULL。

  DEPENDENT UNION:与union类似,表示这个查询要受到外部查询的影响。

  SUBQUERY:除了from子句中包含的子查询外,其他地方出现的子查询都可能时subquery。

  DEPENDENT_SUBQUERY:与dependent union类似,表示这个查询要受到外部查询的影响。

  DERVIED:表示from子句中出现的子查询,也叫做派生表,其他数据库中内联视图或嵌套查询。

  MATERIALIZATION:物化通过将子查询的结果作为一个临时表来提高查询速度,一般来说常驻内存,下次查询会再次引用临时表。

TABLE列:

  表示显示查询表名,如果有别名,则显示别名,如果不涉及数据库的操作则显示null,如果时尖括号括起来的,如<dervied N> ,<union M N> 表示结构来自id为M N的结果集。

TYPE列:

  按照性能从好到差排列 system>const>eq_ref>ref>fulltext>ref_or_null>unique_subquery>index_subquery>range>index_merge>index>all

  SYSTEM表示表中只有一行数据或空表,且只用于myisam引擎的表,如果是innoDB引擎的表则该列通常展示ALL或index。

  CONST表示使用唯一索引或主键且返回的记录只有一条记录的等值条件查询,也叫做唯一索引扫描。

  EQ_REF表示出现在要连接多个表的查询计划中,驱动表循环获取数据,这行数据是第二个表的主键或唯一索引作为查询条件只返回一条数据,且必须是not null,唯一索引和主键是多列时只有所有的列都用作比较时才会出现eq_ref

  REF表时不像eq_ref要求连接顺序,也没有主键和唯一索引的要求,只要使用等值条件检索时就可能出现,常见与辅助索引的等值查找或多列主键/唯一索引中除第一个列之外的等值查找也会出现,返回的记录不确定。

  FULLTEXT表示全文检索索引,全文检索索引优先级很高,如果全文检索索引和普通索引同时存在则优先使用全文检索索引。

  REF_OR_NULL表示与ref方法类似,增加了null值的比较。

  UNIQUE_SUBQUERY表示用于where子句中in形式的查询,子查询返回的记录不重复的唯一值。

  INDEX_SUBQUERY表示in形式的子查询使用到了辅助索引或in常数列表,子查询可能返回重复值可以使用索引将结果去重。

  RANGE表示范围索引扫描,常见于>,<,between,in,like,is null等运算的查询中。

  INDEX_MERGE表示查询使用了两个以上的索引,左后取交集或者并集,常见 and 和or使用了不同的索引.

  INDEX表示索引全表扫描

  ALL表示全表扫描数据文件,再在server层过滤返回符合要求的记录。

KEY列:

  查询真正使用到的索引,type为index_merge时这里会出现两个以上的索引,其他的select_type这里只出现一个。

KEY_LEN列:

  索引关键字的长度。

REF列:

  如果使用常数等值查询,这里会显示const,如果是连接,驱动表的执行计划会显示驱动表的关联字段,如果条件使用了表达式或函数或条件列发生了隐式转换,则显示func

EXTRA列:

  no table used:不带from子句的查询或者from dual。

  NULL:查询的列未被索引覆盖,并且where的筛选条件是索引的前导列,意味着用到了索引但部分字敦未被索引覆盖,必须使用回表来实现,不是纯粹的引用了索引也不是完全没有用到索引。

  using index:不需要回表查询。直接使用索引就可以了。

  using where:查询的列未被索引覆盖,where筛选条件非索引的前导列。

       using where using index:查询的列被索引覆盖,并且where筛选条件是索引列之一,但不是索引的前导列,意味着的无法直接通过索引来获得符合条件的数据。

  using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围。

  using temporary:表示使用了临时表存储中间结果,可以是内存临时表或磁盘临时表。

  using filesort:mysql会使用一个外部的索引对结果进行排序,有较大的开销,需要考虑用索引来优化。

  using intersect:表示使用and的各个条件时该信息表示从处理结果获取交集。

  using union:表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集。

FILTERED列:

  存储引擎返回数据在server层过滤后剩下多小满足查询条件的比例,值是百分比。

今天的文章sql执行计划详解 oracle_sql的执行计划怎么看分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/54273.html

(0)
编程小号编程小号
上一篇 2023-08-29
下一篇 2023-08-29

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注