建立一个联合数据库服务器组的第一步是在多台服务器间水平分区表数据。水平分区表是指将表分成多个较小的表(称为成员表)。每一个成员表与原始表有相同的格式,但仅包含原始表中的部分行。将每一个表放在不同的资源(文件或服务器)上,以使处理负荷分散到多个资源上。例如,某公司从 1 至 9999999 分配客户标识符 (ID)。可将 Customers 表分为 3 个成员表,每个成员表的客户 ID 范围都相同。
如果在使用水平分区时不使用视图,则水平分区将要求应用程序具有确定哪些成员表包含用户请求数据的逻辑,并动态地生成引用这些表的 SQL 语句。应用程序需要使用复杂的查询联接这些成员表。更改成员表还涉及重新编写应用程序代码。为解决这一问题,视图使成员表看起来像一个表。SQL UNION 运算符将具有相同格式的结果集合并为一个。因为所有成员表都具有相同的格式,所以对每个表执行 SELECT * 语句所得到的结果也具有相同的格式,并且可使用 UNION 子句合并这些结果,以形成与原始表的操作相类似的单个结果集。例如,将 Customers 表分散在三台服务器(Server1、Server2 和 Server3)上。在 Server1 上定义的分布式分区视图为:
CREATE VIEW Customers
AS
SELECT * FROM Customers_33
UNION ALL
SELECT * FROM Server2.CustomerDB.dbo.Customers_66
UNION ALL
SELECT * FROM Server3.CustomerDB.dbo.Customers_99
此视图使数据的实际位置对应用程序是透明的。当在引用 Customers 分区视图的 Server1 上执行 SQL 语句时,应用程序看不到数据的位置。如果需要一些行来完成驻留在 Server2 或 Server3 上的 SQL 语句,Server1 上的 SQL Server 实例将自动生成一个分布式查询,从其它服务器中取得所需的行。这种透明性使数据库管理员得以重新分区表,而无须对应用程序重新编码。如果 Customers 视图可更新,则视图的行为与名为 Customers 的表的行为相同。
本地分区视图引用一台服务器上的成员表。分布式分区视图则引用多台服务器上的成员表。包含成员表的服务器称为成员服务器,而包含成员表的数据库称为成员数据库。每一个成员服务器包含一个成员表和一个分布式分区视图。引用任一服务器上的分区视图的应用程序得到的结果相同,就好象每台服务器上存在原始表的完整复本。
2.分区数据库:
若要建立一个有效的数据库服务器联合体,必须:
- 创建多个数据库,每一个数据库分别位于运行 SQL Server 2000 实例的不同的成员服务器上。
- 在原始数据库中对个别表进行分区,使大部分相关数据位于一台成员服务器上。这可能需要不同的方法在各成员数据库上的各种表中分发数据,对一些表进行分区,制作每个成员数据库中其它表的完整复本,并保留一些表在原始服务器上的完整性。
- 设计可纳入业务服务层的数据路由规则,以便应用程序将每条 SQL 语句发送到存储该语句所需的大部分数据的成员服务器。
在此类系统中,最重要的目标是最大程度地减少分布式处理。用户必须能够在同一台成员服务器上配置相关的数据,然后将每个 SQL 语句路由到包含处理语句所需的大部分数据(若不是全部)的成员服务器。例如,用户可能发现数据库中的所有销售额、客户、销售人员和库存清单都可以按照销售区域进行分区,并且大多数 SQL 语句仅引用单个区域中的数据。用户于是可创建多台成员服务器,其中每台服务器都包含一个或多个区域的水平分区数据。如果应用程序能够识别当前正由用户输入引用的区域,则应用程序可将生成的任何 SQL 语句提交到包含该区域数据的成员服务器。唯一生成分布式查询的 SQL 语句是那些引用多个区域数据的语句。
3.SQL Server 2000 还支持 table 基本数据类型,该数据类型可用于存储 SQL 语句的结果集。table 数据类型不适用于表中的列,而只能用于 Transact-SQL 变量和用户定义函数的返回值。
4.SQL视图:
视图可以被看成是虚拟表或存储查询。可通过视图访问的数据不作为独特的对象存储在数据库内。数据库内存储的是 SELECT 语句。SELECT 语句的结果集构成视图所返回的虚拟表。用户可以用引用表时所使用的方法,在 Transact-SQL 语句中通过引用视图名称来使用虚拟表。
通过定义 SELECT 语句以检索将在视图中显示的数据来创建视图。SELECT 语句引用的数据表称为视图的基表。在下例中,pubs 数据库中的 titleview 是一个视图,该视图选择三个基表中的数据来显示包含常用数据的虚拟表:
CREATE VIEW titleview
AS
SELECT title, au_ord, au_lname, price, ytd_sales, pub_id
FROM authors AS a
JOIN titleauthor AS ta ON (a.au_id = ta.au_id)
JOIN titles AS t ON (t.title_id = ta.title_id)
之后,可以用引用表时所使用的方法在语句中引用 titleview。
SELECT *
FROM titleview
一个视图可以引用另一个视图。
SQL Server 2000 支持可引用视图的更复杂的 INSERT、UPDATE 和 DELETE 语句。可在视图上定义 INSTEAD OF 触发器,指定必须对基表执行的个别更新以支持 INSERT、UPDATE 或 DELETE 语句。另外,分区视图还支持 INSERT、UDPATE 和 DELETE 语句修改视图所引用的多个成员表。
视图的结果集通常不保存在数据库中,因此视图也称为虚拟表。视图的结果集动态包含在语句逻辑中并在运行时动态生成。
5.SQL用户定义函数:
用户定义函数接受零个或更多的输入参数,并返回单值。一些用户定义函数返回单个的标量数据值,如 int、char 或 decimal 值。
例如,下面的语句创建一个返回 decimal 的简单函数:
CREATE FUNCTION CubicVolume
-- Input dimensions in centimeters.
(@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
@CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
AS
BEGIN
RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END
然后可以在允许整型表达式的任何地方(如表的计算列中)使用该函数:
CREATE TABLE Bricks
(
BrickPartNmbr int PRIMARY KEY,
BrickColor nchar(20),
BrickHeight decimal(4,1),
BrickLength decimal(4,1),
BrickWidth decimal(4,1),
BrickVolume AS
(
dbo.CubicVolume(BrickHeight,
BrickLength, BrickWidth)
)
)
SQL Server 2000 还支持返回 table 数据类型的用户定义函数:
该函数可声明内部 table 变量,将行插入该变量,然后将该变量作为返回值返回。
一类称为内嵌函数的用户定义函数,将 SELECT 语句的结果集作为变量类型 table 返回。
(未完,待续……)
---------------------------------------------------------------------
6.约束:定义自动强制数据库完整性的方式。约束定义关于列中允许值的规则,是强制完整性的标准机制。
约束类:5类
a.NOT NULL 指定不接受 NULL 值的列。
b.CHECK 约束对可以放入列中的值进行限制,以强制执行域的完整性。
CHECK 约束指定应用于列中输入的所有值的布尔(取值为 TRUE 或 FALSE)搜索条件,拒绝所有不取值为 TRUE 的值。可以为每列指定多个 CHECK 约束。下例显示名为 chk_id 约束的创建,该约束确保只对此关键字输入指定范围内的数字,以进一步强制执行主键的域。
CREATE TABLE cust_sample
(
cust_id int PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
)
c.UNIQUE 约束在列集内强制执行值的唯一性。
对于 UNIQUE 约束中的列,表中不允许有两行包含相同的非空值。主键也强制执行唯一性,但主键不允许空值。UNIQUE 约束优先于唯一索引。
d.PRIMARY KEY 约束标识列或列集,这些列或列集的值唯一标识表中的行。
在一个表中,不能有两行包含相同的主键值。不能在主键内的任何列中输入 NULL 值。在数据库中 NULL 是特殊值,代表不同于空白和 0 值的未知值。建议使用一个小的整数列作为主键。每个表都应有一个主键。
一个表中可以有一个以上的列组合,这些组合能唯一标识表中的行,每个组合就是一个候选键。数据库管理员从候选键中选择一个作为主键。
e.FOREIGN KEY 约束标识表之间的关系。
一个表的外键指向另一个表的候选键。当外键值没有候选键时,外键可防止操作保留带外键值的行。
7.列约束或表约束:
约束可以是列约束或表约束:
a.列约束被指定为列定义的一部分,并且仅适用于那个列(前面的示例中的约束就是列约束)。
b.表约束的声明与列的定义无关,可以适用于表中一个以上的列。
当一个约束中必须包含一个以上的列时,必须使用表约束。
例如,如果一个表的主键内有两个或两个以上的列,则必须使用表约束将这两列加入主键内。假设有一个表记录工厂内的一台计算机上所发生的事件。假定有几类事件可以同时发生,但不能有两个同时发生的事件属于同一类型。这一点可以通过将 type 列和 time 列加入双列主键内来强制执行。
CREATE TABLE factory_process
(event_type int,
event_time datetime,
event_site char(50),
event_desc char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )
8.规则:规则是一个向后兼容的功能,用于执行一些与 CHECK 约束相同的功能。CHECK 约束是用来限制列值的首选标准方法。CHECK 约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个 CHECK 约束。CHECK 约束作为 CREATE TABLE 语句的一部分进行指定,而规则以单独的对象创建,然后绑定到列上。
下例创建一个规则,执行与前面主题中的 CHECK 约束示例相同的功能。
CREATE RULE id_chk AS @id BETWEEN 0 and 10000
GO
CREATE TABLE cust_sample
(
cust_id int
PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
)
GO
sp_bindrule id_chk, 'cust_sample.cust_id'
9.默认值:
如果在插入行时没有指定列的值,那么默认值指定列中所使用的值。默认值可以是任何取值为常量的对象,例如:
- 持续
- 内置函数
- 数学表达式
有两种使用默认值的方法:
- 在 CREATE TABLE 中使用 DEFAULT 关键字创建默认定义,将常量表达式指派为列的默认值。
这是首选的标准方法,也是定义默认值的更简明的方法。
- 使用 CREATE DEFAULT 语句创建默认对象,然后使用 sp_bindefault 系统存储过程将它绑定到列上。
这是一个向前兼容的功能。
下例使用其中一种默认值类型创建表。它创建默认对象给一列指派默认值,并将默认对象绑定到该列上。然后在没有为该列指定值的情况下使用默认值做插入测试,并检索测试行以验证所应用的默认值。
USE pubs
GO
CREATE TABLE test_defaults
(keycol smallint,
process_id smallint DEFAULT @@SPID, --Preferred default definition
date_ins datetime DEFAULT getdate(), --Preferred default definition
mathcol smallint DEFAULT 10 * 2, --Preferred default definition
char1 char(3),
char2 char(3) DEFAULT 'xyz') --Preferred default definition
GO
/* Illustration only, use DEFAULT definitions instead.*/
CREATE DEFAULT abc_const AS 'abc'
GO
sp_bindefault abc_const, 'test_defaults.char1'
GO
INSERT INTO test_defaults(keycol) VALUES (1)
GO
SELECT * FROM test_defaults
GO
下例的输出是:
Default bound to column.
(1 row(s) affected)
keycol process_id date_ins mathcol char1 char2
------ ---------- --------------------------- ------- ----- -----
1 7 Oct 16 1997 8:34PM 20 abc xyz
10.触发器:触发器是一类特殊的存储过程,被定义为在对表或视图发出 UPDATE、INSERT 或 DELETE 语句时自动执行。
触发器是功能强大的工具,使每个站点可以在有数据修改时自动强制执行其业务规则。触发器可以扩展 SQL Server 约束、默认值和规则的完整性检查逻辑,但只要约束和默认值提供了全部所需的功能,就应使用约束和默认值。
表可以有多个触发器。CREATE TRIGGER 语句可以与 FOR UPDATE、FOR INSERT 或 FOR DELETE 子句一起使用,指定触发器专门用于特定类型的数据修改操作。当指定 FOR UPDATE 时,可以使用 IF UPDATE (column_name) 子句,指定触发器专门用于具体某列的更新。
触发器可使公司的处理任务自动进行。在库存系统内,更新触发器可以检测什么时侯库存下降到了需要再进货的量,并自动生成给供货商的定单。在记录工厂加工过程的数据库内,当某个加工过程超过所定义的安全限制时,触发器会给操作员发电子邮件或寻呼。
无论何时只要有新的标题添加到 pubs 数据库中,下面的触发器就会生成电子邮件:
CREATE TRIGGER reminder
ON titles
FOR INSERT
AS
EXEC master..xp_sendmail 'MaryM',
'New title, mention in the next report to distributors.'
与存储过程一样,触发器也返回由触发器内的 SELECT 语句生成的结果集。不建议在触发器中包含 SELECT 语句,但仅填充参数的语句除外。这是因为用户不期望看到由 UPDATE、INSERT 或 DELETE 语句返回的结果集。
可使用 FOR 子句指定触发器的执行时间:
- AFTER
触发器在触发它们的语句完成后执行。如果该语句因错误(如违反约束或语法错误)而失败,触发器将不会执行。不能为视图指定 AFTER 触发器,只能为表指定该触发器。可以为每个触发操作(INSERT、UPDATE 或 DELETE)指定多个 AFTER 触发器。如果表有多个 AFTER 触发器,可使用 sp_settriggerorder 定义哪个 AFTER 触发器最先激发,哪个最后激发。除第一个和最后一个触发器外,所有其它的 AFTER 触发器的激发顺序不确定,并且无法控制。
在 SQL Server 2000 中 AFTER 是默认触发器。
- INSTEAD OF
该触发器代替触发操作执行。可在表和视图上指定 INSTEAD OF 触发器。只能为每个触发操作(INSERT、UPDATE 和 DELETE)定义一个 INSTEAD OF 触发器。INSTEAD OF 触发器可用于对 INSERT 和 UPDATE 语句中提供的数据值执行增强的完整性检查。INSTEAD OF 触发器还允许指定某些操作,使一般不支持更新的视图可以被更新。
(未完,待续……)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
11.排序规则:排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
字符数据的存储方式:在计算机中,字符由不同的位模式(ON 或 OFF)表示。每个字节有 8 位,这 8 位可以有 256 种不同的 ON 和 OFF 组合模式。对于使用 1 个字节存储每个字符的程序,通过给每个位模式指派字符可表示最多 256 个不同的字符。2 个字节有 16 位,这 16 位可以有 65,536 种唯一的 ON 和 OFF 组合模式。使用 2 个字节表示每个字符的程序可表示最多 65,536 个字符。
单字节代码页是字符定义,这些字符映射到每个字节可能有的 256 种位模式中的每一种。代码页定义大小写字符、数字、符号以及 !、@、#、% 等特殊字符的位模式。每种欧洲语言(如德语和西班牙语)都有各自的单字节代码页。虽然用于表示 A 到 Z 拉丁字母表字符的位模式在所有的代码页中都相同,但用于表示重音字符(如"é"和"á")的位模式在不同的代码页中却不同。如果在运行不同代码页的计算机间交换数据,必须将所有字符数据由发送计算机的代码页转换为接收计算机的代码页。如果源数据中的扩展字符在接收计算机的代码页中未定义,那么数据将丢失。如果某个数据库为来自许多不同国家的客户端提供服务,则很难为该数据库选择这样一种代码页,使其包括所有客户端计算机所需的全部扩展字符。而且,在代码页间不停地转换需要花费大量的处理时间。
仅靠单字节字符集存储许多语言所使用的字符也是不够的。例如,一些亚洲语言包含上千个字符,所以每个字符必须使用双字节。双字节字符集正是为这些语言定义的。但是,这些语言都有各自的代码页,在运行不同双字节代码页的计算机之间传输数据也存在困难。
为解决在网络中支持多种代码页时出现的字符转换和解释问题,ISO 标准化组织和称为 Unicode Consortium 的团体定义了 Unicode 标准。Unicode 使用双字节存储每个字符。由于 65,536 个字符足以涵盖世界上所有语言常用的字符,因此 Unicode 标准适用于所有的主要语言。如果网络中的所有计算机和程序都使用 Unicode,则无需进行任何字符转换,每个用户与所有其它用户看到的字符完全相同,并且不会丢失任何字符。
12.SQL索引:索引是与表或视图相关联的结构,可加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构内,使 SQL Server 得以快速有效地找到与键值相关联的一行或多行。
表索引:如果一个表没有创建索引,则数据行不按任何特定的顺序存储。这种结构称为堆集。
SQL Server 索引的两种类型为:
- 聚集
聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。数据行本身构成聚集索引的最低级别。
只有当表包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,则其数据行按堆集方式存储。
- 非聚集
非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。
在非聚集索引内,从索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页的存储方式是堆集还是聚集。对于堆集,行定位器是指向行的指针。对于有聚集索引的表,行定位器是聚集索引键。
只有在表上创建了聚集索引时,表内的行才按特定的顺序存储。这些行就基于聚集索引键按顺序存储。如果一个表只有非聚集索引,它的数据行将按无序的堆集方式存储。
索引可以是唯一的,这意味着不会有两行有相同的索引键值。另外,索引也可以不是唯一的,多个行可以共享同一键值。
有两种方法可以在 SQL Server 内定义索引。CREATE INDEX 语句创建并命名索引。CREATE TABLE 语句支持在创建索引时使用下列约束:
- PRIMARY KEY 创建唯一索引来强制执行主键。
- UNIQUE 创建唯一索引。
- CLUSTERED 创建聚集索引。
- NONCLUSTERED 创建非聚集索引。
视图索引:
视图有时也称为虚拟表,这是由于视图返回的结果集与包含行和列的表具有相同的常规格式,并且在 SQL 语句中可以相同的方式引用视图和表。非索引视图的结果集不永久存储在数据库中。每当查询引用视图时,SQL Server 便动态地将生成视图结果集所需的逻辑合并到由基表中的数据生成完整的查询结果集所需的逻辑中。
对于涉及对大量的行进行复杂处理的非索引视图,为引用视图的每个查询动态生成结果集的开销会很大。这类视图包括聚集大量数据或联接许多行的视图。若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。
在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命令视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。
在视图上创建聚集索引可存储创建索引时生成的结果集。索引视图还自动反映自创建索引后对基表数据所做的更改,这一点与在基表上创建的索引相同。当对基表中的数据进行更改时,索引视图中存储的数据也反映数据更改。视图的聚集索引必须唯一,从而提高了 SQL Server 在索引中查找受任何数据更改影响的行的效率。
与基表上的索引相比,对索引视图的维护可能更复杂。只有当提高的视图结果检索速度超过了修改所需的开销时,才应在视图上创建索引。这样的视图通常包括映射在相对静态的数据上、处理多行以及由许多查询引用的视图。
在视图上创建的第一个索引必须是唯一聚集索引。在创建唯一聚集索引后,可创建其它非聚集索引。视图上的索引命名规则与表上的索引命名规则相同。唯一区别是表名由视图名替换。
若除去视图,视图上的所有索引也将被除去。若除去聚集索引,视图上的所有非聚集索引也将被除去。可分别除去非聚集索引。除去视图上的聚集索引将删除存储的结果集,并且优化器将重新像处理标准视图那样处理视图。
尽管 CREATE UNIQUE CLUSTERED INDEX 语句仅指定组成聚集索引键的列,但视图的完整结果集将存储在数据库中。
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
13.表格格式数据流:
客户端使用称为表格格式数据流 (TDS) 的 SQL Server 专用应用程序级协议来发送 SQL 语句。
14.数据库引擎组件:
Microsoft® SQL Server™ 2000 的关系数据库服务器主要有两部分:关系引擎和存储引擎。
![]()
对只引用本地数据库表的 SELECT 语句的处理可以简单概括为:
1.关系引擎将 SELECT 语句编译为优化的执行计划。执行计划对 SELECT 语句中引用的个别表或索引内的基本行集定义一系列操作。
2.之后,关系引擎使用 OLE DB API 请求存储引擎打开行集。
3.在处理执行计划的步骤并需要数据时,关系引擎使用 OLE DB 从它请求存储引擎打开的行集中提取个别行。存储引擎将数据从数据缓冲区传输到关系引擎。
4.关系引擎将存储引擎行集内的数据合并到最终结果集中并传回用户。
关系引擎的主要任务:a.分析SQL语句;b.优化执行计划;c.执行在执行计划中定义的逻辑操作系列;d.执行在执行计划中定义的逻辑操作系列,如:SET 语句和 CREATE 语句;e.格式化结果.
存储引擎的主要任务:管理存储数据库的文件和文件中的空间使用;生成和读取用来存储数据的物理页;管理物理文件的数据缓冲区和所有 I/O;控制并发。管理事务,以及使用锁定控制并发用户对数据库中行的访问;记录日志和恢复;执行实用工具的功能(如 BACKUP、RESTORE 和 DBCC 语句以及大容量复制).