#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