SQLServer知识总结


1.       char、varchar、nchar、nvarchar的区别

char、varchar类型是非unicode类型,一般用于存储英文字符,占1个字节;nchar、nvarchar类型是unicode类型,一般用于存储非英文格式的字符,占一个字符。

char、nchar是长度固定的类型,如果输入的内容长度不够,则自动用空格补齐长度,所以,数据长度比较短的字段的建议使用char、nchar ;varchar、nvarchar是变长类型,会根据用户的输入自动缩减占用的空间,所以,字段数据过长时建议使用varchar、nvarchar。

总之,char、nchar效率高,但浪费内存;varchar、nvarchar省内存,但效率不高。英文用char、varchar,中文用nchar 、nvarchar。

2.       PrimaryKey主键

数据行的唯一标识,不能有重复的列,一个表可以没有主键。主键分为业务主键和逻辑主键,常用来作为SQLServer主键的两种数据类型是:int(或bigint)+标识符(即自动增长字段);uniqueidentifier(即Guid)。主流倾向于使用Guid。

用int字段自增可以避免并发等问题,不需要开发人员控制自增,而且执行insert语句时不需要指定主键的值。优点:占用空间小,无需开发人员干预,易读;缺点:数据导入导出困难。

用Guid可以保证主键唯一性,Guid使用网卡Mac地址、纳秒级时间、芯片Id等算出来的。SQLServer中生成Guid的函数为:newid(),.Net中生成Guid的方法为Guid.NewGuid(),返回Guid类型。优点:效率高,数据导入导出方便;缺点:占用空间大,不易读。

3.       SQL注入

用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL 语句.使用参数化的SQL就可以避免SQL 注入.1' or 1=1

4.       如何维护数据库的完整性、一致性

尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。

5.       Union连接

左连接以左连接表为主显示左表的全部信息

右连接表以右表为主显示右表的全部信息

全连接则是把两个表全部连接起来显示全部信息

内连接则是显示同时满足条件的信息

6.       数据库三范式

第一范式(1NF)在任何一个关系数据库中,第一范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库。所谓第一范式就是无重复的列。

第二范式(2NF)是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式(2NF)就是要求实体的属性完全依赖于主关键字,即非主属性非部分依赖于主关键字。

第三范式(3NF)满足第三范式必须先满足第二范式。简而言之,第三范式就是数据库表中不包含已在其他表中存在的非主关键字信息,即属性不依赖于其它非主属性。

7.       数据库索引

优点:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;可以大大加快数据的检索速度,这也是创建索引的最主要的原因;可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加;索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

不应创建索引的的这些列具有下列特点:对于那些在查询中很少使用或者参考的列不应该创建索引;对于那些只有很少数据值的列也不应该增加索引;对于那些定义为text, image和bit数据类型的列不应该增加索引。

8.       数据库死锁

数据库死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

9.       存储过程

存储过程一共分为了三类:用户定义的存储过程、扩展存储过程以及系统存储过程。

优点:重复使用。存储过程可以重复使用,从而可以减少数据库开发人员的工作量;提高性能。存储过程在创建的时候就进行了编译,将来使用的时候不用再重新编译。一般的SQL语句每执行一次就需要编译一次,所以使用存储过程提高了效率;减少网络流量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量;安全性。参数化的存储过程可以防止SQL注入式的攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

10.   数据库事务

事物的常用语句:begintransaction、commit transaction、rollback transaction。

原子性(atomic)事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。

一致性(consistent)事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。

隔离性(insulation)由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。防止数据丢失

持久性(Duration)事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

11.   数据库优化

索引内部原理:想象成Dictionary,插入、删除、更新的速度慢了,加上索引也多占用了空间,查询的速度快了.加上索引以后速度提升非常明显.

(1)在经常检索的字段上(select* from Person where Name=@Name)使用索引提高查询速度.

(2)select 中只列出必要的字段,而不是*.

(3)避免隐式类型转换造成的全表扫描,在索引上使用函数也会造成全表扫描(因为索引只是为字段建立的,一旦使用表达式或者函数,那么索引就是失效了,当然也可以使用“函 数索引”,“表达式索引”解决这个问题),使用索引不一定能提高查询速度.

(4)避免在索引列上使用计算(where Name+'A'=@MyName)

(5)不进行无意义优化,根据性能查看器的报表,对最耗时的SQL 进行优化。

12.   大数据处理方法

使用存储过程.并且,并非因为存储过程比较快的原因.由于在数据库内部的存储过程,能够实现一些特殊的功能,比如说,可以直接根据当前的排序结果,仅仅取需要的几条数据,如此,无论数据是多少,它仅仅取需要的几条.  

在实际的操作中,取出的数据,并非你有10万条,它就会把10万条全部取出来,而是受限于服务器的缓存,其实一次一般仅取1000条左右的记录,无论你数据多少,它仅会一次取这么多出来.所以,配合分页控件,再配合.NET提供的加载N条数据的方法,数据量大的情况下,不见得就会慢。真正慢的是在取数据总共多少条这个步骤上。所以,大数据量条件下,即不应再显示"共几条/当前第几条"这样的信息。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值