手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Mssql>列表

50种方法巧妙优化您的SQL

来源:互联网 作者:west263.com 时间:2008-04-02
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  
  16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引
  
  17、注意UNion和UNion all 的区别。UNION all好
  
  18、注意使用DISTINCT,在没有必要时不要用,他同UNION相同会使查询变慢。重复的记录在查询里是没有问题的
  
  19、查询时不要返回无需的行、列
  
  20、用sp_configure 'query governor cost limit'或SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。 SET LOCKTIME配置锁的时间
  
  21、用select top 100 / 10 Percent 来限制用户返回的行数或SET ROWCOUNT来限制操作的行
  
  22、在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE 'P0'",因为他们不走索引全是表扫描。也不要在Where字句中的列名加函数,如Convert,substring等,假如必须用函数的时候,创建计算列再创建索引来替代.还能够变通写法:Where SUBSTRING(firstname,1,1) = 'm'改为Where firstname like 'm%'(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.假如列的值含有空,以前他的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,"NOT", "NOT EXISTS", "NOT IN"能优化她,而"<>"等还是不能优化,用不到索引。
  
  23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
  
  24、假如使用了IN或OR等时发现查询没有走索引,使用显示申明指定索引: Select * FROM PersonMember (INDEX = IX_Title) Where processid IN ('男','女')
  
  25、将需要查询的结果预先计算好放在表中,查询的时候再Select。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
  
  26、MIN() 和 MAX()能使用到合适的索引。
  
  27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不但维护工作小,编写程式质量高,并且执行的速度快。
  
  28、假如要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌Insert来插入 (不知JAVA是否)。因为这样应用程式首先将二进制值转换成字符串(尺寸是他的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。
  
  29、Between在某些时候比IN 速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是相同的。由于in会在比较多次,所以有时会慢些。
  
  30、在必要是对全局或局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗费大量的资源。他的创建同是实际表相同。
  
  31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用他。
  
  32、用OR的字句能够分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,假如查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图和索引匹配。一个关键的问题是否用到索引。
  
   33、尽量少用视图,他的效率低。对视图操作比直接对表操作慢,能够用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:他是存放在服务器上的被优化好了的已产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
  
  34、没有必要时不要用DISTINCT和ORDER BY,这些动作能够改在客户端执行。他们增加了额外的开销。这同UNION 和UNION ALL相同的道理。
  
  select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',
  'JCNAD00333138','JCNAD00303570','JCNAD00303569',
  'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',
  'JCNAD00254567','JCNAD00254585','JCNAD00254608',
  'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',
  'JCNAD00279196','JCNAD00268613') order by postdate desc
  
  35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。

[1] [2] [3] 下一页


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!