加入收藏 | 设为首页 | 会员中心 | 我要投稿 衢州站长网 (https://www.0570zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

实用排坑帖:SQL语句性能优化操作策略大全

发布时间:2019-01-26 01:28:55 所属栏目:建站 来源:SimpleWu
导读:副标题#e# 本文会提到52条SQL语句性能优化策略。 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。 2、应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者

28、索引的使用规范:

  • 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引;
  • 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引;
  • 避免对大表查询时进行table scan,必要时考虑新建索引;
  • 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用;
  • 要注意索引的维护,周期性重建索引,重新编译存储过程。

29、下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢:

  1. SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒)  
  2.  
  3. SELECT * FROM record WHERE amount/30< 1000 (11秒)  
  4.  
  5. SELECT * FROM record WHERE convert(char(10),date,112)=’19991201’ (10秒)  

分析:

WHERE子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引。

如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:

  1. SELECT * FROM record WHERE card_no like ‘5378%’ (< 1秒)  
  2.  
  3. SELECT * FROM record WHERE amount< 1000*30 (< 1秒)  
  4.  
  5. SELECT * FROM record WHERE date= ‘1999/12/01’ (< 1秒) 

30、当有一批处理的插入或更新时,用批量插入或批量更新,绝不会一条条记录的去更新。

31、在所有的存储过程中,能够用SQL语句的,我绝不会用循环去实现。

例如:列出上个月的每一天,我会用connect by去递归查询一下,绝不会去用循环从上个月第一天到最后一天。

32、选择最有效率的表名顺序(只在基于规则的优化器中有效):

Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。

33、提高GROUP BY语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉。下面两个查询返回相同结果,但第二个明显就快了许多。

(编辑:衢州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读