第一: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的情况,不能对其建立索引

第二  索引注意点

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

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

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

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

第三  临时表注意点

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) from Table 的返回值是不同的

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", "NOT LIKE", 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、一次更新多条记录比分多次更新每次一条快,就是说批处理好
、、、、、、、


 

 



 

 

posted on 2011-01-21 15:08  ipusr  阅读(1499)  评论(0编辑  收藏  举报