作家
登录

常用SQL Server规范集锦?看这里~

作者: 来源: 2017-10-17 11:03:36 阅读 我要评论

在 where 子句中, 如不雅索引是函数的一部分, 优化器将不再应用索引而应用全表扫描

假设在字段 Col1 上建有一个索引,则下列场景将无法应用到索引:

常见的字段类型选择

[Col1]+1>9

再举例解释一下

像膳绫擎如许的萌芽,将无法用到 O_OrderProcess 表上的 PrintTime 索引,所以我们应用应用如下所示的萌芽 SQL

禁止在索引列上应用函数或计算

假设在字段 Col1 上建有一个索引,则下列场景将可以应用到索引:

[Col1]=3.14

如不雅数据库字段类型为 CHAR,在应用琅绫擎最好类型指定为 AnsiStringFixedLength 并明白指定其长度

[Col1]>100

[Col1] BETWEEN 0 AND 99

[Col1] LIKE ‘abc%’

[Col1] IN(2,3,5,7)

LIKE 萌芽的索引问题

1.[Col1] like "abc%" --index seek 这个就用到了索引萌芽

2.[Col1] like "%abc%" --index scan 而这个就并未竽暌姑到索引萌芽

3.[Col1] like "%abc" --index scan 这个也并未竽暌姑到索引萌芽

我想大年夜上而三个例子中,大年夜家应当明白,最好不要在 LIKE 前提前面用模糊匹配,不然就用不到索引萌芽。

禁止应用游标

关系数据库合适集合操作,也就是对由 WHERE 子句和选择列肯定的结不雅集作集合操作,游标是供给的一个非集合操作的门路。一般情况下,游标实现的功能往往相当于客户端的一个轮回实现的功能。

游标是把结不雅集放在办事器内存,并经由过程轮回一条一条处理记录,对数据库资本(特别是内存和锁资本)的消费是异常大年夜的。(再加上游标真心比较复杂,挺不好用的,尽量罕用吧)

禁止应用触发器

禁止在萌芽里指定索引

With(index=XXX)( 在萌芽里我们指定索引一般都用 With(index=XXX) )

  • 跟着数据的变更萌芽语句指定的索引机能可能并不最佳
  • 索引对应用应是透明的,如指定的索引被删除将会导致萌芽报错,晦气于排障
  • 新建的索引无法被应用急速应用,必须经由过程宣布代码才能生效

变量 / 参数 / 接洽关系字段类型必须与字段类型一致(这是我之前不太存眷的)

避免类型转换额外消费的 CPU,引起的大年夜表 scan 尤为严重

那我们若何查找除了 name 等于 aa 的所稀有据,只能用 ISNULL 函数了

看了膳绫擎这两个图,我想我不消解释解释,大年夜家都应当已经清跋扈了吧。

如不雅数据库字段类型为 VARCHAR,在应用琅绫擎最好类型指定为 AnsiString 并明白指定其长度

如不雅数据库字段类型为 NVARCHAR,在应用琅绫擎最好类型指定为 String 并明白指定其长度

参数化萌芽

以下方法可以对萌芽 SQL 进行参数化:

sp_executesql

Prepared Queries

Stored procedures

用图来解释一下,哈哈。

限制 JOIN 个数

  • 单个 SQL 语句的表 JOIN 个数不克不及跨越 5 个
  • 过多的 JOIN 个数会导致萌芽分沃圃爝错履行筹划
  • 过多 JOIN 在编译履行筹划时消费很大年夜

在 IN 子句中包含数量异常多的值(数以千计)可能会消费资本并返回缺点 8623 或 8632,请求 IN 子句中前提个数限制在 100 个以内

尽量避免大年夜事务操作

  • 只在数据须要更新时开端事务,削减资本锁持有时光
  • 增长事务异常捕获预处理机制
  • 禁止应用数据库上的分布式事务

用图来解释一下

增长事务异常处理机制

也就是说我们不该该在 1000 行数据都更新完成之后再 commit tran, 你想想你在更新这一千行数据的时刻是不是独有资本导致其它事务无法处理。

封闭影响的行计数信息返回

触发器对应用不通明(应用层面都不知道会什么时刻触发触发器,产生也也不知道,感到莫名……)

应用本地变量选择中庸履行筹划

在存储过程或萌芽中,拜访了一张数据分布很不平均的表格,如许往往会让存储过程或萌芽应用了次优甚至于较差的履行筹划上,造成 High CPU 及大年夜量 IO Read 等问题,应用本地变量防止走错履行筹划。

采取本地变量的方法,SQL 在编译的时刻是不知道这个本地变量的值,这时刻 SQL 会根据表格里数据的一般分布,“猜测” 一个返回值。不管用户在调用存储过程或语句的时刻代入的变量值是若干,生成的筹划都是一样的。如许的计整洁般会比较中庸一些,不必定是最优的筹划,但一般也不会是最差的筹划。

Estimated Rows =(Total Rows * 30)/100

ABS[Col1]=1

Estimated Rows = Density * Total Rows

尽量避免应用 OR 运算符

对于 OR 运算符,平日会应用全表扫描,推敲分化成多个萌芽用 UNION/UNION ALL 来实现,这里要确扰绫侨芽能走到索引并返回较少的结不雅集

应用法度榜样做好不测处理,及时髦 Rollback。


  推荐阅读

  区块链与分布式账本达到“生产成熟期”预计仍需5至10年

沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! Gartner副总裁兼出色分析师Donald Feinberg表示:“在迈向数字化营业的过程中,数据治理仍会处在核心肠>>>详细阅读


本文标题:常用SQL Server规范集锦?看这里~

地址:http://www.17bianji.com/lsqh/37987.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)