本文共 2033 字,大约阅读时间需要 6 分钟。
一、概念
1. 分区视图
分区视图,通常是设计人员在设计数据库时考虑的因素。分区视图在一台或多台服务器间水平连接一组成员表中的分区数据,使数据看起来就像来自一个表。
2. 分类
SQL Server 可以分为2类:
(1)本地分区视图
在本地分区视图中,所有参与表和视图都位于同一个 SQL Server 实例上。
(2)分布式分区视图
分布式分区视图用于实现数据库服务器联合。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。通过这种通过分区数据形成数据库服务器联合体的机制可以向外扩展一组服务器,以支持大型的多层网站的处理需要。
在分布式分区视图中,至少有一个参与表位于不同的(远程)服务器上。分布式分区视图可用于在一组服务器间分布系统的数据库处理负荷。
3. 更新分区视图
分区视图即可以作为基础表read-only副本的视图,也可以更新分区视图的数据。要在分区视图上执行更新,分区依据列必须是基表主键的一部分。如果视图不可更新,可以对允许更新的视图创建 INSTEAD OF 触发器。应该在触发器中设计错误处理以确保不会插入重复的行。
注意:bcp 命令、BULK INSERT 和 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句均不支持向分区视图进行大容量导入。但是,可以使用 INSERT 语句在分区视图中插入多个行。
二、创建分区视图
1. 设计方法
下面以一个销售订单为例来说明。
在上图中,分别用4张表将销售订单进行水平分区,这4张表都有完全相同的表结构和主键。当表中超过几百万条记录时,这种分区的优势就很明显。
在上例中,如果只需查询本月订单时,就只需要查询一张表。为了能够查询包括历史订单在内的所有订单,就需要使用以下语句创建一个分区视图。
CREATE VIEW 所有销售订单ASSELECT * FROM 本月订单表UNION ALLSELECT * FROM 本季度其它订单表UNION ALLSELECT * FROM 本年度其它订单表UNION ALLSELECT * FROM 其它年度订单表 |
2. 查询方法
SQL Server 查询优化器可以通过Check约束识别 SELECT 语句中其搜索条件,并根据主键仅引用相应的基表中的行。因此,它将其搜索范围限制在这些表。
SELECT * FROM 所有销售订单WHERE 订单年份 = 2013 and 订单月份=7 |
3. 限制
分区视图返回正确的结果并不一定需要 CHECK 约束。但是,如果未定义 CHECK 约束,则查询优化器必须搜索所有表,而不是只搜索符合分区依据列上的搜索条件的表。
如果不使用 CHECK 约束,则视图的操作方式与使用 UNION ALL 的任何其他视图相同。查询优化器不能对存储在不同表中的值作出任何假设,也不能跳过对参与视图定义的表的搜索。
CREATE TABLE 本月订单表 (订单编号 INT, 客户编号 INT NOT NULL, 订单年份 INT CHECK (订单年份 = 2013), 订单月份 INT CHECK (订单月份 = 7), 订单日期 DATETIME NULL CHECK(DATEPART(yy, 订单日期) =2013 and DATEPART(mm, 订单日期) = 7 ) CONSTRAINT OrderIDYearMonth PRIMARY KEY(订单编号, 订单年份, 订单月份) ) |
三、垂直分区
1. 设计方法
水平分区的设计原理是将大的表拆分存储到多个小表,这些表都具有相同的结构和主键。但是在某些情况下,这些小表还需要进一步拆分。
例如,一个表的记录宽度比较宽,每一行记录为4600字节,每一页(8KB)只能存储1条记录。而实际业务中频繁查询的只是该表中的某几列。这时候,垂直分区的优势就体现出来了。
在上例中,将一个大型表拆分成无数个小型表,有效地节约磁盘存储空间。在读取或更新数据时,只需要访问所需的列所在的表,无需访问其他表,有利于性能提升。同时,由于分开存储在多个小型表中,锁的粒度也减小了。
2. 查询方法
需要同时读取拆分后的所有小型表时,可以使用视图。
CREATE VIEW 客户资料ASSELECT 客户资料主表.*, 客户资料辅表1.*, 客户资料辅表2.* FROM 客户资料主表JOIN 客户资料辅表1 ON 客户资料主表.客户编号=客户资料辅表1.客户编号JOIN 客户资料辅表2 ON 客户资料主表.客户编号=客户资料辅表2.客户编号 |
本文结语:
通过对表进行水平或垂直分区,使频繁访问的表占用最少的磁盘空间,提高访问效率。当需要访问分区的所有数据时,可以通过创建视图(包含Union或Join子句)实现。
转载地址:http://qfgkx.baihongyu.com/