天天看点

SQLServer优化-实践经验

#SQLServer优化-实践(一)

##1.只查询有用的数据

  • 横向来看,不要返回自己不需要的列,尽量不要使用select *
  • 纵向来看,不要返回自己不需要的行,尽量使用where条件来过滤自己需要的内容
  • 考虑使用top
  • 考虑使用分页
  • 对于聚合查询,可以用having子句进行进一步的过滤

2.避免重复的SQL操作

  • 避免同一SQL语句多次执行,业务上严格控制不必要的逻辑

3.建议使用别名

  • 多表链接,使用别名,提高解析速度,避免列名歧义引发的语法错误
  • 即便不命名别名,SQLServer也会给它一个别名,所以手动显示命名可以提高解析速度

    ##4.禁用隐式转化

  • 类型匹配,特别是字符型和数值型。
  • varchar类型和nvarchar类型也是隐式转化,容易忽略。

    ##5.union all 优于 union

  • 列是相同的,包括列的类型、列的顺序、列的数量
  • 区别:union是在union all的基础上,删除重复的记录。
  • 如果允许重复的记录或者查询除的数据本身没有重复记录,请使用union all
  • union有默认排序
  • UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果
  • UNION ALL只是简单的将两个结果合并后就返回

    ##6.Like操作符

  • 明确左侧内容时,左侧不应使用“%”通配
  • 左侧使用“%”通配,不会执行索引查找,造成性能问题

    ##7.避免对索引字段使用运算或者函数表达式

  • 把对字段的运算转换为对比较值的运算(索引扫描和索引查找)
  • 尽量避免where子句使用函数
  • 尽量避免order by子句使用表达式
  • 限制在group by子句钟使用表达式
  • 因为使用表达式后,可能不能正确使用索引
Converting the parameter value instead
Bad: DATEDIFF(DAY,LogTime,'2012-01-01')=0
Good: LogTime >= '2012-01-01 00:00:00' and LogTime< '2012-01-02 00:00:00'
           

##8.绑定变量

  • 绑定变量会重用执行计划
  • 对于操作特定的行时,建议使用绑定变量
  • 但对于每次操作的行数不固定时,数据库查询优化器可能会产生不同的执行计划,以最优效率执行sql
  • 如果是使用绑定变量,重用了执行计划,将会导致效率降低(增加IO开销)
  • 所以尽量参数化来实现
  • 参数嗅探是我第一次接触到这个概念的知识
  • 参数嗅探参考链接一
  • 参数嗅探参考链接二

    ##9.批量执行SQL

  • 批量插入数据时,为了减少与数据库交互测试,可以每句sql后面加";"
  • 最前加"begin",最尾加"end"
begin
		insert into tableA(…) values ([values1]);
		insert into tableA(…) values ([values2]);
		……                                             ;
		insert into tableA(…) values ([valuesn]);
	end;
           

##10.使用临时表减小与大数据量表的关联

  • 与大数据量表关联,性能较差,建议先把数据提取出来存储到临时表中,之后使用临时表处理

    ##11.空、空格、null

  • ‘’‘与’ '相同,与null不同
  • ’<>'是查询不出null值的

    ##12.不要在分布式事务中使用ddl

  • 在分布式事务中执行创建表、删除表、Truncate表等ddl语句,会带来错误
  • 数据库模式定义语言DDL(Data Definition Language),是用于描述数据库中要存储的现实世界实体的语言
  • 数据库模式定义语言并非程序设计语言,DDL数据库模式定义语言是SQL语言(结构化查询语言)的组成部分。
  • SQL语言包括四种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML),数据控制语言(DCL)和事务控制语言(TCL)

    ##13.NON-SARG(函数,列运算等)

  • SARG:用于限制搜索的一个操作,因为它通常是指一个特定的匹配,一个值得范围内的匹配或者两个以上条件的AND连接。SARG 包含常量描述式(或是可以解析成常量的变量)来与数据表中的字段做比较。
  • 格式:

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

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

  • 列名出现在操作符的一边,而常量或变量出现在另一边。如果列名同时出现在操作的两边就不算是SARG。
  • SARG包含以下操作符=、>、<、>=、<=、BETWEEN及部分情况下的LIKE。LIKE是否符合SARG,要看通配符%所在的位置。例如:LIKE '胡%‘就是符合SARG,但是’%胡’就不符合SARG。因为以通配符开头无法限制SQL SERVER查询记录的数量,索引的摆放依然是以小到大,或以大到小顺序排列,如果以通配符“%”开头就无法利用有序的结构,以二分法来快速查找数据。
  • 简言之,在查询子句中,SARG代表用来查找的常量或变量可以直接与索引键值进行比较

createtime:2018-08-13