SQL优化

---恢复内容开始---

解析

  在空享池中查找相同的SQL语句  (缓冲中查找)

  语法分析   (语法是否准确)

  语义分析     (列名,表名是否准确)

  对象加锁  (防止其他对象进行操作)

  权限检查

  确定执行计划

  保存执行计划  (保存到高速缓冲中)

执行

提取

①  select 中避免写*

②  编写SQL时使用相同的编码风格  这样容易到缓冲中查找到

③  使用where字句代替having字句

select t.projectid,AVG(t.dynamiccost) from cm_costsummary t group by projectid having projectid >4344  0.218
优化为
select t.projectid,AVG(t.dynamiccost) from cm_costsummary t where projectid>4344 group by projectid  0.203

④ 删除全部数据 使用 truncate代替delete

⑤ 确保完整的情况下多commitの3

⑥ 使用Exists替代in exists 主查询小 而子查询大

select * from cm_standardlimitchild c where c.standardlimitid in (select t.standardlimitid from cm_standardlimit t where cityid=-1 ) 0.094
优化为
select * from cm_standardlimitchild c where exists(
       select 1 from cm_standardlimit
       where standardlimitid=c.standardlimitid and cityid=-1
)
0.093

 

⑦用exists替代distinct   distinct需要进行排序来确定哪些行重复  而exists不需要

⑧使用表连接而不是多个子查询  (当查询语句中包含子查询或者子查询的嵌套时,会因为执行了多个查询操作而导致系统效率低下)

⑨使用'<='代替<

    =>100 >99   查询时=>100 会先定位到100 而>99会定位到99 所以>会好一点

⑩尽量使用表的别名并在列前标注来源于哪个表  (显著提高SQL语句的执行效率)

select CITYID, STATEPROVID, CITYCODE, NAME, FULLNAME, ISDEFAULT, DISPLAYORDER, RECORDSTATUS, 
    CREATEUSERID, CREATEDATE, MODIFYUSERID, MODIFYDATE from cf_city   0.125
优化为
select t.CITYID, t.STATEPROVID, t.CITYCODE, t.NAME, t.FULLNAME, t.ISDEFAULT, t.DISPLAYORDER, t.RECORDSTATUS, 
    t.CREATEUSERID, t.CREATEDATE, t.MODIFYUSERID, t.MODIFYDATE from cf_city t  0.094

  

        表的连接方法

①From 字句中将数据量最小的表作为驱动表

   一般情况下,将From字句中的最后指定的表,即出现在From字句最右边的表作为驱动表, 然后系统对驱动表进行排序,然后从右到左,依次处理其余的表

  所以建议选择行数最小的表作为驱动表,来提高SQL的执行效率

②Where字句的连接顺序

  当where字句中有多个查询条件时,顺序为由右到左,即由下到上的顺序,最好将能过滤到表中记录最多的条件写到Where字句的最后

 

     有效使用索引

对经常以查询关键字为基础的表建立索引

索引应建立在where字句经常引用的列上

为了提高多表连接的性能,应该在连接列上建立索引

 

 

 

  

 

posted @ 2018-08-10 15:53  Bockpecehhe  阅读(185)  评论(0)    收藏  举报