SQL优化,其实就这么简单

        上周优化了一条SQL,在这里针对SQL优化,说一下我的理解和看法。

        按照我的理解,SQL优化其实就是降低输入时间、计算时间、输出时间这3个方面。

        下面,展开来说一下这3个方面。

        第一个方面,降低输入时间,主要是指读取存储数据需要消耗的时间。大家都知道,查询需要的数据,在没有缓存的情况下,都需要从磁盘读取上来,磁盘读取的速度决定了输入时间。因此,降低输入时间,有几种办法可以实现:

  1. 直接把数据缓存在内存中,这一点12C新特性In-memory比较好,当然老版本也可也做到表缓存,但是不是很方便,而且存在BUG。
  2. 加快磁盘读取速度,比较常见的是把机械盘换成flash闪存卡,机械盘的速度是远低于flash闪存卡的速度的,目前所谓的国产一体机速度快,基本上都是用flash卡替换了机械盘(Exadata有点区别,它可以offload查询到存储节点)。
  3. 使用合适的索引,可以降低全表扫的IO量,索引虽然会增加存储使用,但是合适的使用索引可以几倍几十倍降低输入时间。
  4. 四是可以把行存储转换为列存储,然后再进行列存储压缩,存储压缩可以降低IO量,但是会增加CPU的使用率,如果在字段重复只较多的列,CPU性能好的情况下,使用存储压缩是可以有效降低输入时间的。

        第二个方面,减低计算时间,这个包含的范围比较大,包含了SQL解析时间、数据运算时间、排序时间等等,因此,可以从多个方面进行优化。

        解析时间可以通过标准SQL编写,绑定参数变量,把硬解析转为软解析甚至软软解析,减少解析时间,另外一点是别使用select *进行查询,数据库需要对*进行解析编译,才能得到所有的字段名称,这个肯定是消耗解析时间的。

        运算时间,这个就涉及到数据库的运算方式,一般来说filter、hash join和nested loop三种,使用哪种运算方式,需要准确的统计信息支持,有时候还需要收集直方图,才能让数据库走正确的执行计划,使用正确的运算方式,当然也可以使用hint强制使用对应的连接方式,而在老版本中,一些SQL写法可以降低运算方式,比如exists/not exists代替in/not in,另外需要注意避免笛卡儿积,笛卡儿积会让计算时间以指数方式增长,而且很可能会把临时表空间撑爆。

        排序时间就比较容易优化了,排序是需要用到PGA的,因此,加大内存可以加快排序,避免用到swap,另外如果排序的字段中有索引,也可以加快排序,当然,直接去掉排序,也是降低排序时间的一种方法。

        第三方面,降低输出时间,这一点可能很多人不是很懂,我认为,客户端发起的一条查询语句,数据库查询出结果后,需要返回给客户端,这个时间我称之为输出时间。因为有时候客户端查询的结果集是很大的情况,输出时间是很长的,因此,如果可以分页查询,逐次返回结果,在某种意义上来说,是降低了输出时间。

        当然,如果返回的结果集实在太大,可以从业务逻辑上进行修改,甚至退回给业务开发,禁止使用这种大量结果集返回的查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值