SQL调优(一)

在大数据量的环境中,系统的响应时间是个很大的挑战,这涉及到很多方面:数据层、应用层、业务层、网络规划布局等。在数据层,我整理了一下几点:
      1. 数据库表的合理设计 ;
      2. 索引、分区表的合理使用;
      3. sql语句的质量;

这篇文章,就从数据库优化开始写起,本文包括数据库设计及sql语句优化。

一、字段设计

        字段是数据库最基本的单位,其设计对性能的影响是很大的。需要注意如下:

       A、数据类型尽量用数字型,数字型的比较比字符型的快很多。

       B、 数据类型尽量小(在满足可以预见的未来需求的前提下的)。

       C、 尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。

       D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。

       E、 自增字段要慎用,不利于数据迁移。

二、减少数据库访问次数:
       内部机制:当执行每条SQL语句时,Oracle在内部执行了许多工作:解析SQL语句,估算索引的利用率,绑定变量,读数据块等等。
       在应用程序中的表现:
       能一次查询的sql,尽量不要拆分查询;
       避免在循环中执行同一sql;

三、避免使用Select *:
       oracle在解析的过程中,会将*依次转换成对应表下所有的列名,这是通过内部数据字典完成的,这意味着将耗费更多的时间。

四、用where替换having语句:
        尽量避免使用having子句,having只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序、总计等操作。如果通过where子句限制记录的数目,那就能减少这方面的开销。
       例如:select emp_no,avg(slary) from salary group by emp_no having emp_no != '5';
                   select emp_no,avg(slary) from salary where emp_no != '5' group by emp_no;

五、减少表查询
例如:
Select emp_name from emp where emp_no = (
Select emp_no from salary where emp_no = '3'
) and dept_no =(
Select dept_no from salary where emp_no = '3'

替换成:
Select emp_name from emp where (emp_no,dept_no)= (
Select emp_no,dept_no from salary where emp_no ='3'


六、使用表别名:
        当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

七、使用exists代替in,not exists 代替not in

八、多表连接查询代替exists

九、使用exists替换distinct
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值