3.1 SQL Server数据库概述
SQL Server 2008中的数据库由包含数据的表集合以及其他对象(如视图、索引、存储过程等)组成,目的是为执行与数据有关的活动提供支持。SQL Server支持在一个实例中创建多个数据库,每个数据库在物理和逻辑上都是独立的,相互之间没有影响。每个数据库存储相关的数据。例如,可以用一个数据库存储商品及销售信息,用另一个数据库存储人事信息。
从数据库的应用和管理角度来看,SQL Server将数据库分为两大类:系统数据库和用户数据库。系统数据库是SQL Server数据库管理系统自动创建和维护的,这些数据库用于保存维护系统正常运行的信息,如一个SQL Server实例上共建有多少个用户数据库,每个数据库的创建日期、占用空间大小、包含的文件个数,以及每个数据库包含的对象等。用户数据库保存的是与用户的业务有关的数据,我们通常所说的建立数据库都是指的创建用户数据库,对数据库的维护也指的是对用户数据库的维护。一般用户对系统数据库只有查询权。
3.1.1 系统数据库
安装好SQL Server 2008后,系统会自动安装5个用于维护系统正常运行的系统数据库,分别是:master、msdb、model、tempdb和Resource。下面简单介绍这几个系统数据库的作用。
master:它是SQL Server 2008中最重要的数据库,记录SQL Server实例的所有系统级信息,包括实例范围的元数据(如登录账户)、端点、链接服务器和系统配置设置。此外,master数据库还记录了所有其他数据库的存在、数据库文件的位置以及 SQL Server的初始化信息。因此,如果master 数据库不可用,则SQL Server将无法启动。
msdb:供SQL Server代理服务调度报警和作业以及记录操作员时使用,保存关于调度报警、作业、操作员等信息,作业是在SQL Server中定义的自动执行的一系列操作的集合,作业的执行不需要任何人工干预。
model:它用做SQL Server实例上创建的所有数据库的模板。对model数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数据库选项)将应用于以后创建的所有用户数据库。当用户创建一个数据库时,系统自动将model数据库中的全部内容复制到新建数据库中。因此,用户创建的数据库不能小于model数据库的大小。
tempdb:临时数据库,用于保存临时对象或中间结果集,并为数据的排序等操作提供一个临时工作空间。每次启动SQL Server时都会重新创建tempdb数据库。
Resource:它是一个只读数据库,包含了SQL Server中的所有系统对象。SQL Server系统对象(如sys.objects)在物理上保留在Resource数据库中,但在逻辑上却显示在每个数据库的sys架构中。因此,在SQL Server Management Studio的对象资源管理器中,在“系统数据库”下看不到这个数据库。
3.1.2 数据库的组成
SQL Server数据库由一组操作系统文件组成,这些文件被划分为两类:数据文件和日志文件。数据文件包含数据和对象,如表、索引、存储过程和视图。日志文件记录了用户对数据库所进行的更改操作。数据和日志信息绝不会混合在同一个文件中,而且一个文件只由一个数据库使用。
- 数据文件
数据文件用于存放数据库数据。数据文件又分为:主要数据文件和次要数据文件。
主要数据文件:主要数据文件的推荐扩展名是.mdf,它包含数据库的系统信息,也可存放用户数据。每个数据库都有且只能有一个主要数据文件。主要数据文件是为数据库创建的第一个数据文件。SQL Server 2008要求主要数据文件的大小不能小于3MB。
次要数据文件:次要数据文件的推荐扩展名是.ndf。一个数据库可以不包含次要数据文件,也可以包含多个次要数据文件,而且这些次要数据文件可以建立在一个磁盘上,也可以分别建立在不同的磁盘上。
当某个数据库包含的数据量非常大,需要占用比较大的磁盘空间时,有可能造成计算机上的任何一个磁盘都不能满足数据库对空间的要求。这种情况下,就可以为数据库创建多个次要数据文件,让每个文件建立在不同的磁盘上。在主要数据文件之后建立的所有数据文件都是次要数据文件。
次要数据文件的使用和主要数据文件的使用对用户来说是没有区别的,而且对用户也是透明的,用户不需要关心自己的数据是存放在主要数据文件上,还是存放在次要数据文件上。
让一个数据库包含多个数据文件,并且让这些数据文件分别建立在不同的磁盘上,不仅有利于充分利用多个磁盘上的存储空间,而且可以提高数据的存取效率。
- 日志文件
日志文件的推荐扩展名为.ldf,用于存放恢复数据库的所有日志信息。每个数据库必须至少有一个日志文件,也可以有多个日志文件。
说明:
1)SQL Server是将数据库映射为一组操作系统文件。数据和日志信息绝不会混合在同一个文件中,而且一个文件只由一个数据库使用。
2)SQL Server 2008不强制使用.mdf、.ndf 和 .ldf 文件扩展名,但建议使用这些扩展名以利于标识文件的用途。
- 关于数据的存储分配
在SQL Server中创建数据库时,了解SQL Server如何为数据分配空间是很有必要的,这样可以比较准确地估算出数据库需占用空间的大小以及如何为数据文件和日志文件分配磁盘空间。
在考虑数据库的空间分配时,需了解如下规则:
所有数据库都包含一个主要数据文件与一个或多个日志文件,此外,还可以包含零个或多个次要数据文件。实际的文件都有两个名称:操作系统管理的物理文件名和数据库管理系统管理的逻辑文件名(在数据库管理系统中使用的、用在Transact-SQL语句中的名字)。SQL Server 2008数据文件和日志文件的默认存放位置为:Program FilesMicrosoft SQL Server MSSQL.1MSSQLData文件夹。
在创建用户数据库时, model数据库自动被复制到新建用户数据库中,而且是复制到主要数据文件中。因此,用户新建数据库的大小不能小于model数据库的大小。
在SQL Server 2008中,数据的存储分配单位是数据页(Page,也简称为页)。一页是一块8KB(8×1024字节,其中用8060字节存放数据,另外的132字节存放系统信息)的连续磁盘空间。页是存储数据的最小空间分配单位,页的大小决定了数据库表中一行数据的最大大小。
不允许表中的一行数据存储在不同页上(varchar(max)、nvarchar(max)、text、ntext、varbinary(max)和image数据类型除外),即行不能跨页存储。因此,表中一行数据的大小(即各列所占空间之和)不能超过8060字节。
一般的大型数据库管理系统都不允许行跨页存储,当一页中剩余的空间不够存储一行数据时,系统将舍弃页内的这块空间,并分配一个新的数据页,将这行数据完整地存储在新的数据页上。根据一行数据不能跨页存储的规则,再根据一个表中包含的数据行数以及每行占用的字节数,就可以估算出一个数据表所需占用的大致空间。例如,假设某数据表有10 000行数据,每行3000字节,则每个数据页可存放两行数据(如图3-1所示),此表需要的空间就为:(10 000/2)×8KB = 40MB。其中,每页中有6000字节用于存储数据,有2060字节是浪费的。因此,该数据表的空间浪费情况大约为25%。
因此,在设计关系表时应考虑表中每行数据的大小,使一个数据页尽可能存储更多的数据行,以减少空间浪费。
3.1.3 数据库文件组
- 文件组基本概念
SQL Server为了便于分配和管理数据文件,将相关的数据文件组织起来,放置到一个文件组中。在数据库中文件组的概念类似于操作系统中的文件夹,在操作系统中,为便于对文件进行管理,可以定义一些文件夹,然后将不同的文件放置到不同的文件夹中。在数据库中,可以定义多个文件组,然后将数据文件放置到不同的文件组中。
SQL Server有两种类型的文件组:主文件组和用户定义的文件组。
(1)主文件组
主文件组(PRIMARY)是系统定义好的一个文件组,它包含主要数据文件和任何没有明确分配给其他文件组的其他数据文件。系统表的所有页均分配在主文件组中。
(2)用户定义的文件组
用户可以创建自己的文件组,以将相关数据文件组织起来,便于管理和数据分配。
例如,可以分别在3个磁盘驱动器上创建3个数据文件:Data1.ndf、Data2.ndf 和Data3.ndf,然后将它们分配到文件组fgroup1上,之后就可以明确地在文件组fgroup1上创建新表,而对表中数据的查询操作将被分散到3个磁盘上,从而提高数据查询性能。
用户定义文件组是通过在CREATE DATABASE或ALTER DATABASE语句中使用FILEGROUP 关键字指定的任何文件组。
说明:
1)日志文件不包括在文件组内,日志空间与数据空间是分开管理的。
2)一个文件不可以是多个文件组的成员。
3)如果文件组中有多个文件,则它们在所有文件被填满之前不会自动增长。填满后,这些文件会循环增长。
如果在数据库中创建对象时没有指定对象所属的文件组,则新建对象将被分配到默认文件组。任何时候,只能将一个文件组指定为默认文件组。如果用户没有显式地使用ALTER DATABASE语句修改默认文件组,则SQL Server的默认文件组是PRIMARY。
- 创建文件组
在SQL Server 2008中,可以在首次创建数据库时创建文件组,也可以在以后向数据库中添加更多文件时创建文件组。但是,一旦将文件放置到某个文件组中,就不能再将这些文件移到其他文件组中。
注意:文件组不能独立于数据库文件创建,文件组是在数据库中组织文件的一种管理机制。
我们将在后续章节中介绍如何在创建及修改数据库时创建文件组。
3.1.4 数据库文件的属性
在定义数据库时,除了指定数据库的名字外,其余要做的工作就是定义数据库的数据文件和日志文件,定义这些文件需要指定的信息包括:
1)文件名及其位置。
数据库的每个数据文件和日志文件都具有一个逻辑文件名和一个物理文件名。逻辑文件名是在所有Transact-SQL语句中引用物理文件时所使用的名称,该文件名必须符合SQL Server标识符规则,而且在一个数据库中,逻辑文件名必须是唯一的。物理文件名包括存储文件的路径以及物理文件名,该文件名必须符合操作系统文件命名规则。一般情况下,如果有多个数据文件的话,为了获得更好的性能,建议将文件分散存储在多个物理磁盘上。
2)初始大小。
可以指定每个数据文件和日志文件的初始大小。在指定主要数据文件的初始大小时,其大小不能小于model数据库中主要数据文件的大小,因为系统是将model数据库的主要数据文件内容复制到用户数据库的主要数据文件上。
3)增长方式。
如果需要的话,可以指定文件是否自动增长。该选项的默认设置为自动增长,即当数据库的空间用完后,系统自动扩大数据库的空间,这样可以防止由于数据库空间用完而造成的不能插入新数据或不能进行数据操作的错误。
4)最大大小。
文件的最大大小指的是文件增长的最大空间限制。默认设置是无限制。建议用户设定允许文件增长的最大空间大小,因为如果不设置文件的最大空间大小,但设置了文件自动增长,则文件将会无限制增长直到磁盘空间用完为止。