配色: 字号:
优化原则
2013-09-11 | 阅:  转:  |  分享 
  
SELECT语句的处理顺序

from/on/join/where/groupby/withcube或withroolup/having/select/distinct/orderby/top

1、避免使用<>和!=,改为<和>

2、or关键字不使用索引,用in代替

3、调整where子句条件顺序

4、避免使用select,改用select列名方式

5、相关子查询中用exists代替in,in方式先执行子查询放入临时表



6、like语句第一个为通配符时不使用索引,如like''%abc%'',查询速度慢

7、避免使用having子句,用where代替

8、使用存储过程

9、setstatisticsioon查看io代价

10、关闭消息反馈机制减少网络流量



11、统计消耗时间setstatisticstimeon

12、查看执行计划setshowplan_texton

13、setshow_plan_allon:要求不执行SQL语句,而是返回有关语句的执行方式和预计所需资源的详细信息,即:执行计划内容。

规则一:判断执行计划中的操作是SEEK(搜索操作)还是SCAN(扫描操作)

规则二:通常情况下,连接比子查询效率更高

14、不要用COUNT()的子查询判断是否存在记录,最好用LEFTJOIN或者EXISTS

15、isnull和isnotnull不使用索引



16、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

17、不要在in关键字中使用子查询,因为在in关键自重使用子查询后是无法使用索引的

18、setnocounton表示不返回sql语句影响的行数

19、避免困难的正则表达式,MATCH、LIKE,如like‘98__’改为>=''9800''and<9900

20、避免对大型表行数据的顺序存取,对连接的列进行索引



21、使用并集来避免顺序存取

SELECTFROMordersWHERE(customer_num=104ANDorder_num>1001)ORorder_num=1008

改为SELECTFROMordersWHEREcustomer_num=104ANDorder_num>1001UNIONALLSELECTFROMordersWHEREorder_num=1008

22、涉及对大表进行统计,循环等操作时,考虑使用临时表

23、总是使用索引的第一个列,当仅使用索引的第二个列时,优化器使用全表扫描

24、windows系统监视器

25、SSMS中的活动监视器

26、SQLSERVERPROFILER

27、数据库优化顾问



28、尽量使用正逻辑而不是非逻辑

29、SQL语句-语法分析和编译-关系代数表达式-查询优化器优化(根据统计信息)-生成执行计划-存储引擎取数据-查询结果输出

30、基于语法(规则)的优化(不管数据的改变,不用到统计信息)、基于代价(成本)的优化



31、execsp_spaceusedtablename查看存储空间使用情况

32、SQLSERVER中,页大小为8kb

33、CPU时间是指:执行语句的时间

而占用时间是指:从磁盘读取数据再处理总的使用时间

34、SETNOCOUNTON可以关闭消息反馈机制,较少网络流量

35、使用DATEDIFF函数来返回SQL语句的执行时间

查询成批的SQL语句的执行时间,使用临时表存储开始时间



36、SETSHOWPLAN_ALLON不执行T-SQL,显示执行计划内容,

SEEK操作性能优于SCAN操作

37、通常情况,连接查询比子查询效率高

38、智能优化SQL语句优化工具LeccoSQLExpertProforSQLServer

Quest公司的QuestCentral工具中SQLTuning工具、SQLTuningforSQLServer

39、orderby语句的非索引项或者计算表达式将降低查询

40、海量数据少用格式转换



41、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开,拆开的子句应包含索引

42、使用insertintotablenameunionall..比多次insert速度快

43、merge语句

44、索引优化向导

45、truncatetable删除表数据是,记录的删除是不做记录的,比delete快



46、覆盖索引、书签查找

47、SQLSERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件

并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。不用担心

索引列条件的位置

48、SARG的定义:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。形式如下:

列名操作符<常数或变量>



<常数或变量>操作符列名



列名可以出现在操作符的一边,而常数或变量出现在操作符的另一边。如:



Name=’张三’

价格>5000

49、IN的作用相当与OR

语句:

Selectfromtable1wheretidin(2,3)



Selectfromtable1wheretid=2ortid=3

是一样的,都会引起全表扫描,如果tid上有索引,其索引也会失效。

5000<价格

Name=’张三’and价格>5000



如果一个表达式不能满足SARG的形式,那它就无法限制搜索的范围了,

也就是SQLSERVER必须对每一行都判断它是否满足WHERE子句中的所有条件。

所以一个索引对于不满足SARG形式的表达式来说是无用的。



50、可以考虑用charindex()>0代替like''%abc%''



51、union并不一定比or执行效率高,当or两边条件为同一个列时就用,or效率高

52、count()不比count(字段)慢

53、orderby按聚集索引列排序速率最高,排序无论是正序还是倒序,速度基本相当

54、高效的TOP(减少IO),在查询和提取超大容量的数据集时,

影响数据库响应时间的最大因素不是数据查找,而是物理的I/0操作

55、在下面这些列上创建非聚集索引:



1)搜索时经常使用到的;



2)用于连接其它表的;



3)用于外键字段的;



4)高选中性的;



5)ORDERBY子句使用到的;



6)XML类型。



56、最后提醒一下使用Case函数的新手注意不要犯下面的错误

CASEcol_1

WHEN1THEN''Right''

WHENNULLTHEN''Wrong''

END



在这个语句中WhenNull这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHENcol_1=NULL,这是一个错误的用法,这个时候我们应该选择用WHENcol_1ISNULL。



献花(0)
+1
(本文系luo的图书馆...首藏)