当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2012-03-30 10:26:00  来源:本站整理

sql语句优化原则[MSSQL防范]

赞助商链接



  本文“sql语句优化原则[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

  1.多where,少having

  where用来过滤行,having用来过滤组

  聚合语句:统计分组数据时用,对分组数据再次判断时用having

  HAVING子句可以让我们挑选成组后的各组数据.; Y( }; X, \5 m1 O

  HAVING子句在聚合后对组记录举行挑选

  而WHERE子句在聚合前先挑选记录.也就是说作用在GROUP BY 子句和HAVING子句前

  Sql代码

  SELECT region, SUM(population), SUM(area)

  FROM bbc

  GROUP BY region

  HAVING SUM(area)>1000000

  在查询历程中聚合语句(sum,min,max,avg,count)要比having子句优先履行.而where子句在查询历程中履行优先级别优先于聚合语句(sum,min,max,avg,count)./

  优先级:where > 聚合语句 > having

  2.多union all,少union

  union删除了反复的行,因此耗费了一些时间

  union只是将两个后果联合起来一同显示(消除了反复行),并非联合两个表

  UNION ALL 这个指令的目的也是要将两个 SQL 语句的后果归并在一同. UNION ALL 和 UNION 差别之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有没有反复.

  3.多Exists,少in

  Exists只查抄存在性,性能比in强很多,not in 不举荐利用,因为不能利用表的索引,举荐not exists,尽大概用exists 替换distinct

  有些朋友不会用Exists,就举个例子

  例,想要得到有电话号码的人的基本信息,table2有冗余信息

  Sql代码

  select * from table1;--(id,name,age)

  select * from table2;--(id,phone)

  in:

  select * from table1 t1 where t1.id in (select t2.id from table2 t2 where t1.id=t2.id);

  Exists:

  select * from table1 t1 where Exists (select 1 from table2 t2 where t1.id=t2.id);

  用in的朋友注意了,当参数超越1000个,数据库就挂了.(oracle 10g数据库)

  4.利用绑定变量

  Oracle数据库软件会缓存已经履行的sql语句,复用该语句可以削减履行时间.

  复用是有条件的,sql语句必须相同

  问:怎样算差别?

  答:随便什么差别都算差别,不管什么空格啊,大小写什么的,都是差别的

  想要复用语句,倡议利用PreparedStatement

  将语句写成以下情势:

  insert into XXX(pk_id,column1) values(?,?);

  update XXX set column1=? where pk_id=?;

  delete from XXX where pk_id=?;

  select pk_id,column1 from XXX where pk_id=?;

  5.罕用*

  因为要把*解析为列名,这时就查询数据字典,自然就耗费了很多时间.

  很多朋友很喜好用*,比方:select * from XXX;

  普通来说,并不需求全部的数据,只需求一些,有的仅仅需求1个2个,

  拿5W的数据量,10个属性来测试:

  (这里的时间指的是PL/SQL Developer显示全部数据的时间)

  利用select * from XXX;平均需求20秒,

  利用select column1,column2 from XXX;平均需求12秒

  (我的机子不是很好...)

  关于开辟来说,这一条是个灾难,知道是一回事,做就是另一回事了

  6.分页sql

  普通的分页sql以下所示:

  sql1:select * from (select t.*,rownum rn from XXX t)where rn>0 and rn <10;

  sql2:select * from (select t.*,rownum rn from XXX t where rownum <10)where rn>0;

  乍看一下没什么辨别,实际上辨别很大...125万条数据测试,

  sql1平均需求1.25秒(咋这么准呢? )

  sql2平均需求... 0.07秒

  缘由在于,子查询中,sql2解除了10以外的全部数据

  当然了,假如查询最后10条,那效率是一样的 假若有分页需求排序,必须再包一层,后果为

  select * from (select t.*, rownum rn from (select * from XXX order by value desc) t where rownum <= 10 ) where rn > 0;

  (oracle数据库)

  7.能用一句sql,千万别用2句sql

  作者 mars914


  以上是“sql语句优化原则[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • SQL语句分组获得记录的第一条数据的办法
  • SQL语句(T-SQL汇总) 用T-SQL画出这些图形
  • SQL语句删除2条反复数据一条保存一条
  • 在SQL Server中利用SQL语句查询一个存储历程被别的全部的存储历程引用的存储历程名
  • sqlserver 改正列名及表名的sql语句
  • SQLServer顶用T—SQL号令查询一个数据库中有哪些表的sql语句
  • SQLServer中字符串左对齐或右对齐显示的sql语句
  • 解析SQL语句性能3种办法分享
  • sqlserver中去除字符串中持续的脱离符的sql语句
  • sqlserver中求字符串中汉字的个数的sql语句
  • 50个常用sql语句 网上风行的学生选课表的例子
  • Sql Server 索引利用情形及优化的相关Sql语句分享
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .