首页 > 数据库 >PL/SQL执行计划查看

PL/SQL执行计划查看

时间:2023-08-21 10:15:38浏览次数:32  
标签:index 查看 scan 扫描 索引 SQL 执行 PL

一.如何查看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)index unique scan:索引唯一扫描。

  单列唯一索引:通过"="判断条件时候才会使用,至多返回一条数据。

  多列唯一索引:所有的列都通过"="判断条件时才会使用,且不能有任何一列的值被指定为null。

2)index range scan:索引范围扫描。

  单列唯一索引:通过">"、"<"、">="、"<="、"between"等判断条件时会被使用。

  多列唯一索引:全部或部分列(必须包含第一列,否则不会走这条索引)通过">"、"<"、">="、"<="、"between"等判断条件时会被使用。部分列也可以在通过"="判断条件时候被使用。

  普通索引:单列索引正常的条件判读都会使用范围扫描,多列的索引必须带有第一列索引的条件判断才会被使用范围扫描。

3)index skip scan:索引跳跃扫描。

  只有当组合索引,且引导列(第一列)没有被使用的情况下,可能会使用索引跳跃扫描。一般发生在引导列的distinct值很少的情况下。oracle帮我们改写了sql语句,如select * from A where b=100,组合索引(a,b)中a的取值只有1和2时,sql会被改写为select * from A where a = 1 and b = 100 union all select * from A where a = 2 and b = 100。 

4)index full scan:索引全扫描。

  这一个和索引快速扫描异曲同工。通常是在使用索引列进行count、sum等函数统计时候使用。

5)index fast full scan:索引快速扫描。

 

关于索引,有以下几种情况时候不会被使用(只针对数据字段查询,不包括count、sum等函数统计):

1)'%'被添加在参数前面。

 

2)带'not'的条件,包括'<>'、'!='。

3)执行函数(函数索引除外。如果定义的是函数索引,即使使用函数仍然是可能会走索引。)

4)格式不正确(下图的jksbh字段是vchar类型,令它与number类型比较,不会走索引。)

 

5)使用null判断

 

记录一下PLSQL12的一个注册码

PLSQL Developer 12 注册码
product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le 
serial Number:226959 
password: xs374ca

标签:index,查看,scan,扫描,索引,SQL,执行,PL
From: https://www.cnblogs.com/lydg/p/17645232.html

相关文章

  • mysql 聚簇索引
    聚簇索引概念聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但InnoDB的聚簇......
  • Oracle数据库经纬度坐标查询优化与结果错误原因分析、SQL中WKT超长文本字符串处理
    目录一、Oracle几何空间数据对象和其他数据库的差异二、Oracle查询一个经纬度坐标是否在边界内部2.1查询条件2.2查询结果错误,似乎是仅做了MBR匹配2.3错误原因2.4解决办法三、SQL中WKT超长文本在Oracle中如何编写3.1Oracle中执行含超长文本的SQL报错3.2使用CLOB无限拼接得到......
  • 分析 plsql 存储过程的手段
    一般来说存储过程有问题,或者说运行比较慢,都是sql本身执行慢,就把存储过程的问题转化成优化sql问题上了。使用dbms_profile包可以查看存储过程的具体运行情况,每一步的运行时间,可以帮助我们更好的分析存储过程mos文档号如下UsingDBMS_PROFILER(DocID97270.1)......
  • PLS-00103: 出现符号 ")"在需要下列之一时
    执行Oracle存储过程时,出现“PLS-00103:出现符号")"在需要下列之一时:”,Cause:java.sql.SQLException:ORA-06550:第22行,第4列:PLS-00103:出现符号")"在需要下列之一时:(-+casemodnewnotnull<anidentifier><adouble-quoteddelimited-identifier>......
  • Splay,LCT,ETT
    Splay核心代码。总结就是双旋voidrot(intx,int&k){ inty=tr[x].fa,z=tr[y].fa; intkd=(tr[y].son[0]==x)?0:1; if(y==k)k=x; else{ if(tr[z].son[0]==y)tr[z].son[0]=x; elsetr[z].son[1]=x; } tr[y].son[kd]=tr[x].son[!kd];tr[tr[y].son[kd]].fa=y; tr[......
  • SQL优化(2)
    数据库优化快照隔离在保护事务不脏读未提交的数据修改的同时尽量减少锁定争用(数据修改的同时可以读取未提交修改前的) 查询状态SELECTname,is_read_committed_snapshot_onFROMsys.database设置快照隔离ALTERDATABASEdatabase_nameSETREAD_COMMITTED_SNAPSHOTON......
  • SQL 优化(1)
    SQLServer查询优化器筛选条件分析通过筛选条件减少扫描范围注意项:模糊查询,尽量不要把百分号放置在前面:LIKE‘%xx’,查询优化器无法对此优化,只能扫描查找(表扫描或索引扫描查找)尽量避免使用OR(可考虑UNIONALL),扰乱查询优化器流程避免对列值进行运算,查询不走索引避免使用NO......
  • SQL 基础(2)
    casewhen查询SELECTname,course,score,casewhenscore<60then'不及格'whenscore>=60then'及格'whenscore<80andscore>=70'良好'else'优秀'endascolumn_nameFROMtable_nameSELECTname,course,scorecase......
  • 测试使用QT来连接SQLServer并取出表格数据
    测试使用QT来连接SQLServer并取出表格数据添加引用工程文件需要加入 QT+=sql在main.cpp添加头文件引用//添加头文件#include<qdebug.h>#include<QSqlDatabase>#include<QSqlError>#include<QSqlQuery>连接数据库QSqlDatabasedb=QSqlDatabase::addDatabase("QODBC");......
  • MYSQL: length() vs char_length()
     selectlength('€'),char_length('€')-->1,1 LENGTH() returnsthelengthofthe stringmeasuredinbytes.CHAR_LENGTH() returnsthelengthofthe stringmeasuredincharacters.ThisisespeciallyrelevantforUnicode,inwhich......