数据库基本概念:区、页、行

:SQL Server中管理空间的基本单位。一个区大小为64KB,是八个物理上连续的页。SQL Server中每MB有16个区。一旦一个区被存储满,SQL Server将分配一个区给下一条数据。

:SQL Server中存储数据的基本单位,是区的分配单元。一个页大小为8KB。是SQL Server 每次读取和写入数据的最小单位。页的类型有数据页,索引页,文本页等等。

:行存储于页中,一行一般最多占满一页,也就是8KB,但也有些VARCHAR(MAX),TEXT,IMAGE类型的字段,可以跨越多页存储,一行最大2GB。

收缩数据库

数据库中每个文件都可以通过删除未使用的页的方法来收缩。数据文件和事务日志文件都可以收缩。数据库收缩分为手动收缩和通过数据库设置自动收缩。

设置数据库自动收缩

数据库引擎会定期检查每个数据库的空间使用情况,自动收缩有可用空间的数据库。

ALTER DATABASE test
SET AUTO_SHRINK ON;
设置关闭自动收缩
ALTER DATABASE test
SET AUTO_SHRINK OFF;
数据库手动收缩

DBCC SHRINKDATABASE(test,10);

GO

或者使用如下命令:

USE test
DBCC SHRINKFILE('test',0,TRUNCATEONLY);

上面命令收缩了test数据库的test.mdf文件,设置目标文件大小为0MB,TRUNCATEONLY参数表示将文件所有可用空间全部释放给操作系统,但不在文件内部执行页迁移。

收缩事务日志文件

若要运行SHRINKFILE命令收缩文件,首先要将数据库恢复模式设置成SIMPLE来截断该文件。

USE test
GO
ALTER DATABASE test SET RECOVERY SIMPLE;--将test数据库恢复模式设置成SIMPLE
GO
DBCC SHRINKFILE('test_log',1,TRUNCATEONLY);
--将test_log.ldf文件收缩到MB,且不允许文件内部页迁移
GO
ALTER DATABASE test SET RECOVERY FULL;
--将test数据库恢复模式设置回FULL
GO
截断数据文件

必须先用SELECT语句获取数据文件的file_id

USE test
GO
SELECT FILE_ID,name FROM sys.database_files;--获取test数据库中数据文件和日志文件的file_id
GO
DBCC SHRINKFILE(1,TRUNCATEONLY);--截断并收缩该file_id对应的文件
GO
清空文件
ALTER DATABASE test--创建一个空数据文件test1data.ndf放在E盘
ADD FILE(
NAME='test1data',
FILENAME='E:\test1data.ndf',
SIZE=5MB
);
GO DBCC SHRINKFILE('test1data',EMPTYFILE);--利用SHRINKFILE语句清空该数据文件
GO ALTER DATABASE test--删除该文件
REMOVE FILE test1data;
GO

复制和移动数据库

SQL Server 2008使用2中方式来进行复制和移动数据库操作。

分离和附加数据库

此方法是复制和移动数据库的最快方式。要求用户必须是源和目标服务器sysadmin固定服务器角色的成员,源数据库脱机,分离数据库前要将数据库设置成单用户模式。

SQL管理对象

此方法稍慢,但不要求数据库脱机,要求用户是源数据库所有者且有CREATE DATABASE的权限。右键数据库—任务—复制数据库。

优化数据库

优化数据库就是提高数据库的稳定性,运行速度和执行能力。主要从3个方面对数据库进行优化。

数据文件和事务日志文件的放置

尽量把多个数据文件分散在不同物理驱动器的不同逻辑磁盘上。尽量把数据文件和事务日志文件分散在不同物理驱动器的不同逻辑磁盘上。这样做的目的是可以同时从多个物理磁盘驱动器上读取文件,让系统执行并行操作,提高系统使用数据的效率。

例如假设SQL Server 2008有A,B两个物理驱动器,A下有C,D两个逻辑磁盘,B下有E,F两个逻辑磁盘,数据库test有test1.mdf和test2.mdf两个数据文件,test1_log.ldf和test2_log.ldf两个事务日志文件。此时最佳做法是将这4个文件分别放在CDEF4个逻辑磁盘内。

使用文件组

文件组是数据库文件的集合,方便数据库数据的管理与分配。文件组中的文件不能再移动到其他文件组中,文件组中只包含数据文件,不包含事务日志文件。文件组只能提高性能,不能提高稳定性,因为一旦文件组中有1个文件早到破坏,整个文件组的数据都无法使用。

RAID技术的使用

Redundant Array of Independent Disks,即独立磁盘冗余阵列,是由多个磁盘驱动器组成的磁盘系统,比较复杂,在此不做详细描述。

表的基础知识

临时表

临时表分为本地临时表和全局临时表。本地临时表表名#打头,只对当前用户连接可见,用户断开连接后被自动删除。全局临时表表名##打头,对所有用户都可见,当所有引用该表的用户断开连接时被自动删除。

系统表

系统表存储了SQL Server 2008服务器配置,数据库设置,用户和表对象描述等信息,一般来说只能由DBA来使用该表。

注:数据库表操作已掌握,此处省略。

数据类型

整数数据类型

Bigint:存储范围-263~263-1范围内所有正负整数,存储在8个字节中,每个字节长度8位

Int:存储范围-231~231-1范围内所有正负整数,存储在4个字节中,每个字节长度8位

Smallint:存储范围-215~215-1范围内所有正负整数,存储在2个字节中,每个字节长度8位

Tinyint: 存储范围0~255范围内所有正整数,存储在1个字节中,每个字节长度8位

Bit(位类型)

只有0和1两种取值,作为逻辑变量使用,用来表示真与假,是与否的二值选择

Money和Smallmoney(货币类型)

Money:用于存储货币值,存储范围-263~263-1,分为整数部分和小数部分,前4个字节存储整数部分,后4个字节存储小数部分。精确到小数点后四位。

Smallmoney:用于存储货币值,存储范围-231~231-1,分为整数部分和小数部分,前2个字节存储整数部分,后2个字节存储小数部分。精确到小数点后四位。

近似数字数据类型

针对类似无限循环小数这种无法精确表示的数据

Real:存储范围-3.40E-38~3.40E+38范围内的正负十进制数值,精确到第7位小数。用4个字节存储空间。

Float(n):存储范围-1.79E-308~1.79E+308,精确到第15位小数,参数n可指示保存4字节或8字节。

Decimal(p,s):取值范围-1038+11038-1,带有固定精度和位数的数据类型,p表示精度,s表示位数。p的取值范围138,s的取值范围0p,占用217个字节的存储空间

Numeric:SQL Server2008中同decimal(p,s)

Unicode字符数据类型

Nchar(n):固定长度的字符数据类型。参数n代表字节数,取值范围1~4000

Nvarchar(n): 可变长度的字符数据类型。参数n代表字节数,取值范围1~4000

Ntext:最大长度可到达230-1个字符。

二进制数据类型

Binary:存储固定长度的二进制数据。最大长度8000

Varbinary:存储可变长度的二进制数据。存储长度为实际输入的数据长度+4个字节

Image:存储照片,目录图片或图画,不能直接通过insert语句输入,存储长度最大为2GB

时间日期数据类型

Date:只存储日期数据类型,范围0001-01-01到9999-12-31

Time:只存储时间数据类型,范围00:00:00.0000000到23:59:59.9999999

Datetimeoffset:由年月日时分秒小数秒组成的时间结构

Datetime2:时间日期混合组成的时间结构,其中小数秒的位数可以设置

字符串数据类型

Char:固定长度字符串数据类型,每个字符使用一个字节的存储空间,最大占位8000个字符

Varchar: 可变长度字符串数据类型,其余同char

Text:可变长度字符串数据类型,最大占位231-1个字符

注:选择固定长度数据类型还是可变长度数据类型,应考虑存储的数据长度是否相同,相同则使用固定长度数据类型,不同但差别不大,考虑到节省存储空间,提高数据库运行效率,应选择可变长度数据类型。

其他数据类型

Sql_variant:用于存储各种数据类型(int,binary,char)

Timestamp:时间戳数据类型,反应数据库中数据修改的相对顺序,相当于单调上升的计时器

Uniqueidentifier:16字节长的二进制数据类型,存储全局唯一标识符代码,可通过调用SQL Server的newid()函数获得,全球唯一。

Xml:用于保存整个XML文档

Table:用于存储对表或试图处理后的结果集

Cursor:是变量或者存储过程OUTPUT参数的一种数据类型,包含对游标的引用。

创建自己的数据类型

使用存储过程sp_addtype创建自己的数据类型

USE test
GO
EXEC sp_addtype credit,'int','NULL';

新数据类型名称credit,参照系统数据类型int,允许为空。

定义标识字段IDENTITY的应用

当一个字段被IDENTITY定义为标识字段,当新增一条记录,该字段会被系统自动赋值,并按设置的增量递增。每个表只允许指定1个标识字段。

USE test
GO
ALTER TABLE CustNew
ADD s_id INT IDENTITY(1,1);
GO

上述语句为CustNew表新增一个s_id列,该列数据类型为int,标量种子为1,增量为1。再例如

USE test
GO
ALTER TABLE CustCopy
ADD t_id INT IDENTITY(2,4);
GO

然后查询该表数据如下



我们再来看一个错误的案例

USE test
GO
ALTER TABLE a
ADD t_id VARCHAR(12) IDENTITY(2,4);
GO

新增一个列t_id并将数据类型设置为VARCHAR,将该字段设置为标识字段,下面是报错

消息2749,级别16,状态2,第1 行

标识列't_id' 的数据类型必须是int、bigint、smallint、tinyint 或decimal,或者是小数位数为0 的numeric 数据类型,并且约束为不可为Null。

注:取消标识列最常用的办法就是新建一列并删除标识列,再将新建列的列名修改成标识列的列名。就是替代的方法。

数据库的完整性

数据的值必须正确无误,数据类型必须正确设置,且必须确保统一表格数据之间和不同表格数据之间的相容关系。

实体完整性

通过设定主键,唯一键,标识列,唯一索引等多种方法,确保数据库中所有实体的唯一性。

区域完整性

通过设定默认值,检查,外键,数据类型和规则等多种方法,确保字段值在一个特定的允许范围内。

参考完整性

通过设定外键,检查,触发器和存储过程等多种方法,确保相关数据库表之间数据一致性。

用户自定义类型

通过设定规则,触发器,存储过程和约束自定义数据,来确保自定义完整性。

《SQL Server 2008从入门到精通》--20180628的更多相关文章

  1. 《SQL Server 2008从入门到精通》--20180724

    目录 1.事务 1.1.事务的ACID属性 1.2.事务分类 1.2.1.系统提供的事务 1.2.2.用户自定义的事务 1.3.管理事务 1.3.1.SAVE TRANSACTION 1.3.2.@@ ...

  2. 《SQL Server 2008从入门到精通》--20180717

    目录 1.触发器 1.1.DDL触发器 1.2.DML触发器 1.3.创建触发器 1.3.1.创建DML触发器 1.3.2.创建DDL触发器 1.3.3.嵌套触发器 1.3.4.递归触发器 1.4.管 ...

  3. 《SQL Server 2008从入门到精通》--20180716

    1.锁 当多个用户同时对同一个数据进行修改时会产生并发问题,使用事务就可以解决这个问题.但是为了防止其他用户修改另一个还没完成的事务中的数据,就需要在事务中用到锁. SQL Server 2008提供 ...

  4. 《SQL Server 2008从入门到精通》--20180710

    目录 1.使用Transact-SQL语言编程 1.1.数据定义语言DDL 1.2.数据操纵语言DML 1.3.数据控制语言DCL 1.4.Transact-SQL语言基础 2.运算符 2.1.算数运 ...

  5. 《SQL Server 2008从入门到精通》--20180704

    XML查询技术 XML文档以一个纯文本的形式存在,主要用于数据存储.不但方便用户读取和使用,而且使修改和维护变得更容易. XML数据类型 XML是SQL Server中内置的数据类型,可用于SQL语句 ...

  6. 《SQL Server 2008从入门到精通》--20180703

    SELECT操作多表数据 关于连接的问题,在<SQL必知必会>学习笔记中已经讲到过,但是没有掌握完全,所以再学一下. JOIN连接 首先我们先来看一下最简单的连接.Products表和Ve ...

  7. 《SQL Server 2008从入门到精通》20180627

    数据库范式理论 范式理论是为了建立冗余较小结构合理的数据库所遵循的规则.关系数据库中的关系必须满足不同的范式.目前关系数据库有六种范式:第一范式(1NF).第二范式(2NF).第三范式(3NF).BC ...

  8. 《SQL Server 2008从入门到精通》--20180723

    目录 1.架构 1.1.创建架构并在架构中创建表 1.2.删除架构 1.3.修改表的架构 2.视图 2.1.新建视图 2.2.使用视图修改数据 2.3.删除视图 3.索引 3.1.聚集索引 3.2.非 ...

  9. 《SQL Server 2008从入门到精通》--20180629

    约束 主关键字约束(Primary Key Constraint) 用来指定表中的一列或几列组合的值在表中具有唯一性.建立主键的目的是让外键来引用. Primary Key的创建方式 在创建表时创建P ...

随机推荐

  1. Hibernate 抛出的 Could not execute JDBC batch update

    异常堆栈 org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update at or ...

  2. JavaScript -- Constructor、Prototype

    ----- 012-constructor.html ----- <!DOCTYPE html> <html> <head> <meta http-equiv ...

  3. 分布式处理与大数据平台(RabbitMQ&Celery&Hadoop&Spark&Storm&Elasticsearch)

    热门的消息队列中间件RabbitMQ,分布式任务处理平台Celery,大数据分布式处理的三大重量级武器:Hadoop.Spark.Storm,以及新一代的数据采集和分析引擎Elasticsearch. ...

  4. 安装Oracle需要调整的linux内核参数

    在安装Oracle的时候需要调整linux的内核参数,但是各参数代表什么含义呢,下面做详细解析. Linux安装文档中给出的最小值: fs.aio-max-nr = 1048576 fs.file-m ...

  5. Maven 添加 Tomcat 插件

    若想在 Maven 中使用 Tomcat 服务器,需要在 pom.xml 文件中的 <build></build> 标签中添加以下代码 <!-- Maven项目编译插件 ...

  6. [转] Lodop、C-Lodop使用说明及样例

    本文转自:http://www.lodop.net/LodopDemo.html Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又可用程序代码直接实现 复杂打印. ...

  7. [转]SQL Server 2008- Get table constraints

    本文转自:https://stackoverflow.com/questions/14229277/sql-server-2008-get-table-constraints You should u ...

  8. 另一个SqlParameterCollection中已包含SqlParameter(转)

    一般情况下,我们定义的一个SqlParameter参数数组,如: SqlParameter[] parms =             {                new SqlParamete ...

  9. vue中watch数组或者对象

    1.普通的watch data() { return { frontPoints: 0 } }, watch: { frontPoints(newValue, oldValue) { console. ...

  10. Eclipse中让Scala缩进变为4

    Windows->preference->Scala->Editor->Formatter->Spaces to indent