sql server规范

常见的字段类型选择

1.字符类型建议采用varchar/nvarchar数据类型
2.金额货币建议采用money数据类型
3.科学计数建议采用numeric数据类型
4.自增长标识建议采用bigint数据类型   (数据量一大,用int类型就装不下,那以后改造就麻烦了)
5.时间类型建议采用为datetime数据类型
6.禁止使用text、ntext、image老的数据类型
7.禁止使用xml数据类型、varchar(max)、nvarchar(max)

约束与索引

每张表必须有主键

•每张表必须有主键,用于强制实体完整性

 

•单表只能有一个主键(不允许为空及重复数据)

•尽量使用单字段主键

 

不允许使用外键

•外键增加了表结构变更及数据迁移的复杂性
•外键对插入,更新的性能有影响,需要检查主外键约束
•数据完整性由程序控制

NULL属性

•新加的表,所有字段禁止NULL
新表为什么不允许NULL? 
允许NULL值,会增加应用程序的复杂性。你必须得增加特定的逻辑代码,以防止出现各种意外的bug
三值逻辑,所有等号(“=”)的查询都必须增加isnull的判断。
Null=Null、Null!=Null、not(Null=Null)、not(Null!=Null)都为unknown,不为true
举例来说明一下:
如果表里面的数据如图所示:
你想来找查找除了name等于aa的所有数据,然后你就不经意间用了

SELECT * FROM NULLTEST WHERE NAME<>’aa’

结果发现与预期不一样,事实上它只查出了name=bb而没有查找出name=NULL的数据记录

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

SELECT * FROM NULLTEST WHERE ISNULL(NAME,1)<>’aa’

但是大家可能不知道ISNULL会引起很严重的性能瓶颈 ,所以很多时候最好是在应用层面限制用户的输入,确保用户输入有效的数据再进行查询。
旧表新加字段,需要允许为NULL(避免全表数据更新 ,长期持锁导致阻塞)(这个主要是考虑之前表的改造问题)

索引设计准则

•应该对 WHERE 子句中经常使用的列创建索引
•应该对经常用于连接表的列创建索引
•应该对 ORDER BY 子句中经常使用的列创建索引
•不应该对小型的表(仅使用几个页的表)创建索引,这是因为完全表扫描操作可能比使用索引执行的查询快
•单表索引数不超过6个
•不要给选择性低的字段建单列索引
•充分利用唯一约束
•索引包含的字段不超过5个(包括include列)

不要给选择性低的字段创建单列索引

•SQL SERVER对索引字段的选择性有要求,如果选择性太低SQL SERVER会放弃使用•
•不适合创建索引的字段:性别、0/1、TRUE/FALSE
•适合创建索引的字段:ORDERID、UID等

充分利用唯一索引

唯一索引给SQL Server提供了确保某一列绝对没有重复值的信息,当查询分析器通过唯一索引查找到一条记录则会立刻退出,不会继续查找索引

表索引数不超过6个

表索引数不超过6个(这个规则只是携程DBA经过试验之后制定的。。。)

•索引加快了查询速度,但是却会影响写入性能
•一个表的索引应该结合这个表相关的所有SQL综合创建,尽量合并
•组合索引的原则是,过滤性越好的字段越靠前
•索引过多不仅会增加编译时间,也会影响数据库选择最佳执行计划

SQL查询

禁止在数据库做复杂运算
•禁止使用SELECT *
•禁止在索引列上使用函数或计算
•禁止使用游标
•禁止使用触发器
•禁止在查询里指定索引
•变量/参数/关联字段类型必须与字段类型一致
•参数化查询
•限制JOIN个数
•限制SQL语句长度及IN子句个数
•尽量避免大事务操作
•关闭影响的行计数信息返回
•除非必要SELECT语句都必须加上NOLOCK
•使用UNION ALL替换UNION
•查询大量数据使用分页或TOP
•递归查询层级限制
•NOT EXISTS替代NOT IN
•临时表与表变量
•使用本地变量选择中庸执行计划
•尽量避免使用OR运算符
•增加事务异常处理机制
•输出列使用二段式命名格式

 

禁止在数据库做复杂运算

•XML解析
•字符串相似性比较
•字符串搜索(Charindex)
•复杂运算在程序端完成

禁止使用SELECT *

•减少内存消耗和网络带宽
•给查询优化器有机会从索引读取所需要的列
•表结构变化时容易引起查询出错

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

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

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

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

ABS[Col1]=1

[Col1]+1>9

再举例说明一下

像上面这样的查询,将无法用到O_OrderProcess表上的PrintTime索引,所以我们应用使用如下所示的查询SQL

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

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

[Col1]=3.14

[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尤为严重

看了上面这两个图,我想我不用解释说明,大家都应该已经清楚了吧。

如果数据库字段类型为VARCHAR,在应用里面最好类型指定为AnsiString并明确指定其长度

如果数据库字段类型为CHAR,在应用里面最好类型指定为AnsiStringFixedLength并明确指定其长度

如果数据库字段类型为NVARCHAR,在应用里面最好类型指定为String并明确指定其长度

参数化查询

以下方式可以对查询SQL进行参数化:

•sp_executesql
•Prepared Queries
•Stored procedures
用图来说明一下,哈哈。

限制JOIN个数

•单个SQL语句的表JOIN个数不能超过5个
•过多的JOIN个数会导致查询分析器走错执行计划
•过多JOIN在编译执行计划时消耗很大

限制IN子句中条件个数

•在 IN 子句中包括数量非常多的值(数以千计)可能会消耗资源并返回错误 8623 或 8632,要求IN子句中条件个数限制在100个以内

尽量避免大事务操作

•只在数据需要更新时开始事务,减少资源锁持有时间
•增加事务异常捕获预处理机制
•禁止使用数据库上的分布式事务
用图来说明一下
也就是说我们不应该在1000行数据都更新完成之后再commit tran,你想想你在更新这一千行数据的时候是不是独占资源导致其它事务无法处理。

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

在SQL语句中显示设置Set Nocount On,取消影响的行计数信息返回,减少网络流量

除非必要SELECT语句都必须加上NOLOCK

除非必要,尽量让所有的select语句都必须加上NOLOCK

指定允许脏读。不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设  置的排他锁不会阻碍当前事务读取锁定数据。允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改。这可能会使您的事务出错,向用户显示从未提交过的数据,或者导致用户两次看到记录(或根本看不到记录)

使用UNION ALL替换UNION

使用UNION ALL替换UNION

UNION会对SQL结果集去重排序,增加CPU、内存等消耗

查询大量数据使用分页或TOP

合理限制记录返回数,避免IO、网络带宽出现瓶颈

递归查询层次限制

使用 MAXRECURSION 来防止不合理的递归 CTE 进入无限循环

临时表与表变量

使用本地变量选择中庸执行计划

在存储过程或查询中,访问了一张数据分布很不平均的表格,这样往往会让存储过程或查询使用了次优甚至于较差的执行计划上,造成High CPU及大量IO Read等问题,使用本地变量防止走错执行计划。

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

l如果查询中本地变量使用了不等式运算符,查询分析器使用了一个简单的 30% 的算式来预估
Estimated Rows =(Total Rows * 30)/100 
l如果查询中本地变量使用了等式运算符,则查询分析器使用:精确度 * 表记录总数来预估
Estimated Rows = Density * Total Rows

 

尽量避免使用OR运算符

对于OR运算符,通常会使用全表扫描,考虑分解成多个查询用UNION/UNION ALL来实现,这里要确认查询能走到索引并返回较少的结果集

增加事务异常处理机制

应用程序做好意外处理,及时做Rollback。
设置连接属性 "set xact_abort on"

输出列使用二段式命名格式

二段式命名格式:表名.字段名 

有JOIN关系的TSQL,字段必须指明字段是属于哪个表的,否则未来表结构变更后,有可能发生Ambiguous column name的程序兼容错误

架构设计

读写分离
•schema解耦
•数据生命周期

读写分离

•设计之初就考虑读写分离,哪怕读写同一个库,有利于快速扩容
•按照读特征把读分为实时读和可延迟读分别对应到写库和读库
•读写分离应该考虑在读不可用情况下自动切换到写端

Schema解耦

禁止跨库JOIN

数据生命周期

根据数据的使用频繁度,对大表定期分库归档

主库/归档库物理分离

日志类型的表应分区或分表

对于大的表格要进行分区,分区操作将表和索引分在多个分区,通过分区切换能够快速实现新旧分区替换,加快数据清理速度,大幅减少IO资源消耗

频繁写入的表,需要分区或分表

自增长与Latch Lock 

闩锁是sql Server自己内部申请和控制,用户没有办法来干预,用来保证内存里面数据结构的一致性,锁级别是页级锁

如果您觉得本篇博文对您有所收获,觉得小女子还算用心,请点击右下角的 [推荐],谢谢!

转载于:https://www.cnblogs.com/liyunhua/p/4534442.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 结构体_【开发规范】PHP编码开发规范下篇:PSR-2编码风格规范

之前的一篇文章是对PSR-1的基本介绍接下来是PSR-2 编码风格规范&#xff0c;它是 PSR-1 基本代码规范的继承与扩展。PSR-1 和PSR-2是PHP开发中基本的编码规范&#xff0c;大家其实都可以参考学习下&#xff0c;虽然说每个开发者都有自己熟悉的一套开发规范&#xff0c;但是我觉…

faster rcnn学习之rpn训练全过程

上篇我们讲解了rpn与fast rcnn的数据准备阶段&#xff0c;接下来我们讲解rpn的整个训练过程。最后 讲解rpn训练完毕后rpn的生成。 我们顺着stage1_rpn_train.pt的内容讲解。 name: "VGG_CNN_M_1024" layer {name: input-datatype: Pythontop: datatop: im_infotop: …

Android学习之高德地图的通用功能开发步骤(二)

周一又来了&#xff0c;我就接着上次的开发步骤&#xff08;一&#xff09;来吧&#xff0c;继续把高德地图的相关简单功能分享一下 上次写到了第六步&#xff0c;接着写第七步吧。 第七步&#xff1a;定位 地图选点 路径规划 实时导航 以下是我的这个功能NaviMapActivity的…

Oracle中分区表中表空间属性

Oracle中的分区表是Oracle中的一个很好的特性&#xff0c;可以把大表划分成多个小表&#xff0c;从而提高对于该大表的SQL执行效率&#xff0c;而各个分区对应用又是透明的。分区表中的每个分区有独立的存储特性&#xff0c;包括表空间、PCT_FREE等。那分区表中的各分区表空间之…

期刊论文格式模板 电子版_期刊论文的框架结构

最近看到很火的一句话&#xff0c;若不是生活所迫&#xff0c;谁愿意把自己弄得一身才华。是否像极了正想埋头苦写却毫无头绪的你&#xff1f;发表期刊论文的用途 &#xff1a;1: 学校或者单位评奖&#xff0c;评优&#xff0c;推免等2&#xff1a;申领学位证(如毕业硬性要求&a…

faster rcnn学习之rpn 的生成

接着上一节《 faster rcnn学习之rpn训练全过程》&#xff0c;假定我们已经训好了rpn网络&#xff0c;下面我们看看如何利用训练好的rpn网络生成proposal. 其网络为rpn_test.pt # Enter your network definition here. # Use ShiftEnter to update the visualization. name: &q…

初学java之常用组件

1 2 import javax.swing.*;3 4 import java.awt.*;5 class Win extends JFrame6 {7 JTextField mytext; // 设置一个文本区8 JButton mybutton;9 JCheckBox mycheckBox[]; 10 JRadioButton myradio[]; 11 ButtonGroup group; //为一…

anaconda 安装在c盘_最省心的Python版本和第三方库管理——初探Anaconda

打算把公众号和知乎专栏的文章搬运一点过来。 历史文章可以去关注我的公众号&#xff1a;不二小段&#xff0c;或者知乎&#xff1a;段小草。也欢迎来看我的视频学Python↓↓↓跟不二学Python这篇文章可以作为Python入门的第一站可以结合这期视频来看&#xff0c;基本上是这期视…

dubbo控制中心部署,权重配置,以及管控台中各个配置的简单查看

dubbo给我们提供了现成的后台管理网站&#xff0c;专门管理这些服务&#xff0c;应用&#xff0c;路由规则&#xff0c;动态配置&#xff0c;访问控制、权重控制、负载均衡等等&#xff0c;还可以查看系统日志&#xff0c;系统状态&#xff0c;系统环境等等&#xff0c;功能很是…

1001种玩法 | 1001种玩法--数据存储(2)

新智云www.enncloud.cn第二趴 Flockdb&#xff1a;一个高容错的分布式图形数据库 FlockDB是一个存储图数据的分布式数据库&#xff0c;图数据库的存储对象是数学概念图论里面的图&#xff0c;而非图片。Twitter使用它来存储人与人之间的关系图&#xff0c;这些关系包括&#xf…

Android ListView分页,动态添加数据

1.ListView分页的实现&#xff0c;重点在于实现OnScrollListener接口&#xff0c;判断滑动到最后一项时&#xff0c;是否还有数据可以加载&#xff0c; 我们可以利用listView.addFootView(View v)方法进行提示 自定义一个ListView&#xff08;这里本来想进行一些自定已修改的。…

faster rcnn的测试

当训练结束后&#xff0c;faster rcnn的模型保存在在py-faster-rcnn/output目录下&#xff0c;这时就可以用已有的模型对新的数据进行测试。 下面简要说一下测试流程。 测试的主要代码是./tools/test_net.py&#xff0c;并且使用到了fast_rcnn中test.py。 主要流程就是&…

Android-Universal-Image-Loader 的使用说明

这个图片异步载入并缓存的类已经被非常多开发人员所使用&#xff0c;是最经常使用的几个开源库之中的一个&#xff0c;主流的应用&#xff0c;随便反编译几个火的项目&#xff0c;都能够见到它的身影。但是有的人并不知道怎样去使用这库怎样进行配置&#xff0c;网上查到的信息…

faster rcnn end2end 训练与测试

除了前面讲过的rpn与fast rcnn交替训练外&#xff0c;faster rcnn还提供了一种近乎联合的训练&#xff0c;姑且称为end2end训练。 根据论文所讲&#xff0c;end2end的训练一气呵成&#xff0c;对于前向传播&#xff0c;rpn可以作为预设的网络提供proposal.而在后向传播中&…

基于像素聚类的分割方法基于slic的方法_博士论文摘要 | 张荣春:数码影像与TLS点云数据融合提取地质结构面方法研究...

《测绘学报》构建与学术的桥梁 拉近与权威的距离数码影像与TLS点云数据融合提取地质结构面方法研究张荣春1,21.南京邮电大学地理与生物信息学院, 江苏 南京 210023;2.河海大学地球科学与工程学院, 江苏 南京 211100收稿日期&#xff1a;2019-03-27基金项目&#xff1a;国家自然…

jaxb转xml空值双标签_单品运营思维:标签-词路-聚焦-直搜-超直

非标品标签思维&#xff1a;针对非标品 主要是2.0为主的打法根据搜索入池的关键词&#xff0c;有什么词做什么词。有个细节&#xff1a;不一定进什么词做什么词&#xff0c;这个维度当中加入3.0的思维3.0入手 转2.0再切3.0(检测词路健康度&#xff0c;非严格意义估算单量)举例&…

如何在PFSense中设置故障转移和负载平衡

故障转移是一种备份操作模式&#xff0c;仅在主系统由于系统故障或任何计划停机时间而变得不可用时&#xff0c;系统组件&#xff08;如网络&#xff09;的操作才由辅助系统承担。在本教程中&#xff0c;我们将看到如何设置故障转移和负载平衡&#xff0c;以使pfSense能够将流量…

图像金字塔总结

本文转载自&#xff1a; http://blog.csdn.net/dcrmg/article/details/52561656 一、 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;通过对原始图像进行多尺度像素采样的方式&#xff0c;生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部…

什么叫做罗列式_项目起盘的时候,如何确定自己该做什么社群?

这是祁杰『社群日记』第48篇持续日更&#xff0c;做最懂社群的营销咨询人很多人手上有资源&#xff0c;准备起盘项目的时候&#xff0c;总会思考一个问题&#xff1a;我能做什么样的社群&#xff1f;今天我们从用户需求出发&#xff0c;拆解一下哪些社群是能够确切地满足用户的…

Feature Pyramid Networks for Object Detection 总结

最近在阅读FPN for object detection,看了网上的很多资料&#xff0c;有些认识是有问题的&#xff0c;当然有些很有价值。下面我自己总结了一下&#xff0c;以供参考。 1. FPN解决了什么问题&#xff1f; 答&#xff1a; 在以往的faster rcnn进行目标检测时&#xff0c;无论…