SQL语句优化

   对SQL语句进行优化有以下一些直接原因:

1. SQL语句是对数据库(数据) 进行操作的惟一途径,应用程序的执行最终要归结为SQL语句的执行,SQL语句的效率对数据库系统的性能起到了决定性的作用。

2. SQL语句消耗了70%~90%的数据库资源。

3. SQL语句独立于程序设计逻辑,对SQL语句进行优化不会影响程序逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低。

4. SQL语句可以有不同的写法,不同的写法在性能上的差异可能很大

5. SQL语句易学,难精通。SQL语句的性能往往同实际运行系统的数据库结构、记录数量等有关,不存在普遍适用的规律来提升性能。

 

第一:SQl基本规范

1、尽量避免使用游标(效率比较差,特别是数据量大的情况,可以采用条件过滤或者数据到临时表,再做操作!)

2、需要注意Where条件顺序(先根据索引、范围大小确定前后顺序;字段顺序尽量与索引顺序一致;范围由大到小)

3、尽量不要再where条件中 = 号的后面 中采用函数、算术等运算(可能导致系统无法正常使用索引)

4、使用exists代替in、select count(1)判断记录是否存在

5、尽量使用 “ >= ”,不要使用 " > "

6、进行Insert、update的时候,应该防止冲突(特别是数据量大的时候,锁会升级)

7、like使用注意(尽量不采用“%1%” 之类的方式处理,多采用 “1% ”、“%1”)

8、避免连接字段查询(如  a.first+'|'+b.name =XXXX,应该采用 a.first='X' and b.name ='XXX')

9、字段有Null的情况,不能对其建立索引

10、选择最有效的表名顺序(在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表)

11、SELECT子句中避免使用 ‘ * ‘(在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间.)

12、用Where子句替换HAVING子句(避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销

第二  索引注意点(索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块

1、根据实际情况建立,即使数据量很大的表,索引不能超过6个

2、尽量使用索引的字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引

3、数据量大的表,尽量建立索引

4、在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不被使用

5、索引字段最好不要当计算字段,“!=” 会破坏索引

 

第三  临时表注意点

1、尽量不使用 distinct \order by \ group by\having \ join \ cumpute 等,因为这些会增加临时表的负担

2、创建临时表时,如果插入的数据量大,可以采用 select into 替换 create table,避免产生log,提高速度;如果插入数据量不大,可以采用 create table  然后再 insert

3、如果临时表的数据量大,也需要建立索引(最好包含在一个存储过程中)

4、临时表要及时删除;(先 truncate table  ,在 drop table ,减少系统表被锁定的时间)

 

第四  其他

1、不要在一句话里多次的使用相同的函数,浪费资源,将结果放在变量里再调用更快

2、Select COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别:select count(Field of null) from Table 和 select count(Field of NOT null) fromTable 的返回值是不同的

3、UNion和UNion all 的区别,UNION all更好

4、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
5、查询时不要返回不需要的行、列
6、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
7、一般不要用如下的字句: "IS NULL","<>", "!=", "!>", "!<","NOT", "NOT EXISTS", "NOT IN", "NOTLIKE", and "LIKE '%500'",因为他们不走索引全是表扫描。也不要在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"能优化她,而"<>"等还是不能优化,用不到索引。

8、一次更新多条记录比分多次更新每次一条快,就是说批处理好

 


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值