一.如何查看PLSQL的执行计划
在SQl Window窗口输入sql语句,然后按键"F5",就会进入执行计划查看界面。
二.界面说明
首先我们看第二行有几个属性可以选“Tree”、“HTML”、“Text”、“XML”。这几个里面的核心数据是一样的,不同的只是对核心数据的展示方式,分别为Tree、HTML、Text、XML。这个可以根据个人习惯来进行选择。
再下面有几个列属性(每个人的列属性可能会不同,这个是可以在PLSQL中进行配置)
我们首先看第一列的Description:下面的内容分别是我们这条SQL的执行步骤,缩进量最多的步骤最先执行,如果缩进量相同,则按照从上往下的顺序执行。
Object owner:对象的所有者。
Object name:对象名称。
Cost:成本花费。这里可以详细地查看SQL执行的每一步的成本花费。
Time:执行时间。
三.如何优化SQL
1.查看SQL是全表扫描还是利用索引查询。
假设有一张表t_srhs_jks,里面有1000万条数据,我们在这张表中执行一条SQL:
我们可以看到根据条件dtnm=****查询数据,由于DTNM字段不是索引,因此首先执行了"TABLE ACCESS FULL",即全表搜索,然后再执行上面的"SELECT STATEMENT, GOAL = ALL ROWS"查询出所有数据行。
在这条SQL中的成本花费一共是14287(Cost=14287),执行时间是172(Time=172)。
然后我们对dtnm字段添加索引后再执行这条SQL:
相比第一次执行,这里的成本花费只有5385,执行时间只有65,减少了将近一倍。
然后我们再来查看一下Description下的执行步骤:
(1)INDEX RANGE SCAN:索引范围内查找。
(2)TABLE ACCESS BY INDEX ROWID:根据索引找到的ROWID来查找需要的数据。
(3)SELECT STATEMENT,GOAL = ALL ROWS:根据找到的数据,返回所有行。
关于索引,有以下几种情况时候不会被使用:
1)'%'被添加在参数前面。
2)带'not'的条件,包括'<>'、'!='。
3)执行函数(函数索引除外。如果定义的是函数索引,即使使用函数仍然是可能会走索引。)
4)格式不正确(下图的jksbh字段是vchar类型,令它与number类型比较,不会走索引。)