Oracle SQL优化

SQL语句执行过程:
校验 - 查询 - 查询优化
参考:SQL语句执行过程

如何获取语句的执行计划:
1.直接解析SQL语句
Explain plan for XXX;
Select * from table(dbms_xplan.display);
2.根据SQL_ID查询
3.从试图v$session.sql_child_number=0,1,
参考:获取SQL语句的执行计划

绑定变量:
变量绑定是OLTP系统中一个非常值得关注的技术。良好的变量绑定会使OLTP系统数据库中的SQL 执行速度飞快,内存效率极高;不使用绑定变量可能会使OLTP 数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢。
当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去SQL语句。 Oracle 在接收到这些SQL后,会先对这个SQL做一个hash 函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash 值匹配的SQL存在。 如果找到了,Oracle将直接使用已经存在的SQL 的执行计划去执行当前的SQL,然后将结果返回给用户。 如果在共享池中没有找到相同Hash 值的SQL,oracle 会认为这是一条新的SQL。 会进行解析。
参考:绑定变量

IO是理解SQL优化的关键:
相比CPU和内存,IO的发展是比较缓慢的。
SAS磁盘,15000转/分钟=15000转/60000毫秒,即4毫秒一转。
为什么oracle那么吃内存:
1.因为IO是瓶颈,因此数据库中大量采用内存换IO的方法,将最近访问的数据缓存在共享内存中,来避免IO瓶颈。
2.数据库操作数据是在内存中进行的,操作内存中的数据就叫做逻辑读,如果数据不在内存中,则需要读取磁盘,这叫物理读。
3.将多个会话同时需要内存中一个数据时,但却不在内存中,这时将有一个会话负责从磁盘中读取到共享内存中。

Oracle架构:
在这里插入图片描述
小贴士:
读取一个10G大小的表,需求多长时间?
一次读取16个BLOCK(一个IO),一个BLOCK 8K
即一个IO读取128K
一个IO4毫秒,即4毫秒读取128K
因此10G=1010241024=10485760K
4(MS)*10485760K/128 = 327680(MS)= 6 分钟左右

单表访问路径:
1 全表扫描(Full Table Scans, FTS)
2 通过ROWID访问表(table access by ROWID)
3 索引扫描(Index scan)
1)索引范围扫描(INDEX RANGE SCAN)
2)索引唯一扫描(INDEX UNIQUE SCAN)
3)索引全扫描(index full scan)
4)索引快速扫描(index fast full scan)
5)索引跳跃式扫描(index skip scan)
参考:单表访问路径

Select * from a的过程:
1.找到表A的断头,里面记录了哪一个文件哪一个块属于表A
2.判断表A各个BLOCK在内存中是否存在,不存在则通过IO函数读取内存,此时发生物理读。
3.ioctl(哪一个文件,开始偏移量,读取多少)
4.每一个block读取内存后,根据row directory获得每一行的偏移量,将记录拿到,返回客户端,此时发生逻辑读。

索引特点:
1.索引是从小到大排好序的,适合范围扫描,id between xx and yy,找到比yy大的数值则推出。
2.单索引中不存储null值-where id is null怎么办
3.索引的该结构决定了索引具有快速定位数据的功能
4.索引在适合较多数据时不如全表扫描高效

表连接方式:
嵌套连接适合与返回少量数据,并且内部表关联字段上存在索引,外部表很小或者走索引后返回很少的数据。成本约定等于N词索引(N为外部连接返回的记录数)
Hash连接适合返回大量数据,不要求表关联字段存在索引
Hash连接的成本为两张表访问路径的总成本
Hash连接用在返回少量数据上很吃亏。

AWR报告:
参考:AWR报告

IS NULL 与 IS NOT NULL:
1.不能用null作为索引,任何包含bull值的列都将不会被包含在索引中。
2.任何在where语句中使用is null或者is not null的语句优化器时不允许使用索引的。

联结列:
1.对于有联结的列,即使最后的联结值是一个静态值,优化器也不会使用索引的。

带通配符(%)的立刻语句:
通配符(%)在搜寻词首出现,所以Oracle系统不使用的索引

Order by 语句:
在这里插入图片描述
IN和EXISTS:
在这里插入图片描述
用表连接替换EXISTS:
在这里插入图片描述
用EXISTS替换DISTINCT:
在这里插入图片描述
用WHERE替代ORDER BY:
在这里插入图片描述
用UNION替换OR:
在这里插入图片描述
SELECT子句中避免使用’ * ':
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值