查看执行计划,分析慢查询SQL

在MySql中可以使用EXPLAIN关键字来查看执行计划并分析sql的执行情况,而在Oracle数据库中则需要两条sql来查看执行计划

EXPLAIN PLAN FOR  SELECT * FROM user  where username = 'zhangsan';
SELECT * FROM TABLE(dbms_xplan.display);

使用EXPLAIN PLAN FOR命令生成执行计划,并将其存储到系统表PLAN_TABLE中,然后通过一个查询语句显示生成的执行计划。

其中dbms_xplan.display是一个Oracle系统函数。返回的结果显示,该语句在Oracle中是通过'SYS_C0016771'索引范围扫描来查找数据的。

  • Id:  执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。 一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)如:上面执行计划的执行顺序为:3-->2-->1-->0
  • Operation: 当前操作的内容。
  • Name:操作对象
  • Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。Rows的值对于CBO做出正确的执行计划来说至关重要。 如果CBO获得的Rows值不够准确(通常是没有做分析或者分析数据过旧造成),在执行计划成本计算上就会出现偏差,从而导致CBO错误的制定出执行计划。在多表关联查询或者SQL中有子查询时,每个关联表或子查询的Rows的值对主查询的影响都非常大,甚至可以说,CBO就是依赖于各个关联表或者子查询Rows值计算出最后的执行计划。 对于多表查询,CBO使用每个关联表返回的行数(Rows)决定用什么样的访问方式来做表关联(如Nested loops Join 或 hash Join)。
  • Bytes:表示执行该步骤后返回的字节数。
  • Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。
  • Time:Oracle 估计当前操作的时间。

SQL指定索引

可以使用  /*+ index(user inx_username)*/  来指定这条sql语句使用触发那个索引

 SELECT /*+ index(user inx_username)*/  *  FROM user

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐