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

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值