分布式数据库内容分区表和分区视图sql Server 2000 分区视图的运用分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。
Microsoft® SQL Server™ 2000 区分本地分区视图和分布式分区视图。
在本地分区视图中,所有的参与表和视图驻留在同一个 SQL Server 实例上。
在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。
此外,SQL Server 2000 还区分可更新的分区视图和作为基础表只读复本的视图。
分布式分区视图可用于实现数据库服务器联合体。
联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。
这种通过分区数据形成数据库服务器联合体的机制使您能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。
有关更多信息,请参见设计联合数据库服务器。
在实现分区视图之前,必须先水平分区表。
原始表被分成若干个较小的成员表。
每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则)。
如果正在创建分布式分区视图,则每个成员表分别位于不同的成员服务器上。
为了获得最大程度的位置透明度,各个成员服务器上的成员数据库的名称应当是相同的,但不要求非这样。
例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。
成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。
键值范围基于分区列中的数据值。
每一成员表中的值范围通过分区列上的 CHECK 约束强制,并且范围之间不能重叠。
例如,不能使一个表的值范围从 1 到 200000,而另一个表的值范围从 150000 到 300000,因为这样将不清楚哪个表包含 150000 与 200000 之间的值。
例如,正在将一个Customer表分区成三个表。
这些表的 CHECK 约束为:-- On Server1:CREATE TABLE Customer_33(CustomerID INTEGER PRIMARY KEYCHECK (CustomerID BETWEEN 1 AND 32999),... -- Additional column definitions)-- On Server2:CREATE TABLE Customer_66(CustomerID INTEGER PRIMARY KEYCHECK (CustomerID BETWEEN 33000 AND 65999),... -- Additional column definitions)-- On Server3:CREATE TABLE Customer_99(CustomerID INTEGER PRIMARY KEYCHECK (CustomerID BETWEEN 66000 AND 99999),... -- Additional column definitions)主要功能是为了提高大数据量性能,通过把数据放到不同表,或不能同服务器的不同数据库实例上。
来提高数据性能。
下面看一个实际,转自WEB CAST在服务器A创建表CUSTOMERS//ServerAUse pubsgoCreate table customers (Customerid varchar(5) not null,CompanyName varchar(50) not null,ContactName varchar(30) null,CONSTRAINT PK_customers PRIMARY KEY CLUSTERED (Customerid),CONSTRAINT CK_customerid CHECK (Customerid between'AAAAA'and'LZZZZ'))在服务器B也创建另一张表,表的结果,类型完全一样,注意表的CHECK不同。
(表名可以不同,但最好一样)//Server Buse pubsgoCreate table customers (Customerid varchar(5) not null,CompanyName varchar(50) not null,ContactName varchar(30) null,CONSTRAINT PK_customers PRIMARY KEY CLUSTERED (Customerid),CONSTRAINT CK_customerid CHECK (Customerid between'M'and'ZZZZZ'))go在A服务器上创建B服务器的链接服务器,已使A服务器能访问B服务器,//ServerAexec sp_addlinkedserver@server='DPVSERVER1', @srvproduct='',@provider='SQLOLEDB', @datasrc='ServerB'goexec sp_addlinkedsrvlogin@rmtsrvname='DPVSERVER1', @useself='false', @rmtuser='sa', @rmtpassword='password'go同样,B服务器,创建A服务器的链接服务器,//ServerBexec sp_addlinkedserver@server='DPVSERVER2', @srvproduct='',@provider='SQLOLEDB', @datasrc='ServerA'exec sp_addlinkedsrvlogin@rmtsrvname='DPVSERVER2', @useself='false', @rmtuser='sa', @rmtpassword='password'go在A服务器上设置,属性,//ServerAExec sp_serveroption 'DPVSERVER1', 'lazy schema validation', 'true' B服务器上,设置属性,//Sever BExec sp_serveroption 'DPVSERVER2', 'lazy schema validation', 'true' A服务器上创建分区视图://Server A:Create view DPV_Customers AsSelect*from CustomersUnion allSelect*from DPVSERVER1.Pubs.dbo.CustomersB服务器也创建分区视图:(注意视图,UNION ALL的顺序)Create view DPV_Customers AsSelect*from DPVSERVER2.Pubs.dbo.CustomersUNION ALLSelect*from Customers下面使用DPV_CUSTOMERS,和实际物理表一样执行的时候打开查询分析器的执行计划,可以看到,实际,会优化,实际应该读那一张,写那一样表。
set xact_abort onINSERT INTO DPV_CUSTOMERS VALUES('AAMAY','FUZHOU COMPANY','MARRY')INSERT INTO DPV_CUSTOMERS VALUES('CJOHN','XIMEN COMPANY','MARRY')INSERT INTO DPV_CUSTOMERS VALUES('SMITH','SHANGHAI COMPANY','TOM')INSERT INTO DPV_CUSTOMERS VALUES('YOUNG','FUJIAN COMPANY','JANE')INSERT INTO DPV_CUSTOMERS VALUES('GTOPP','BEJING COMPANY','TOM')INSERT INTO DPV_CUSTOMERS VALUES('QUILH','BEJING COMPANY','TOM')//SELECT*FROM DPV_Customers order by customerid//SELECT*FROM DPV_Customers WHERE CustomerID='QUILH'这个功能很不错,不过也会有一些问题,1,表不能有DEFAULT 约束2,INSERT 要一次性查询所有列的值,没有值的用NULL3,各个表个CHECK集合不能有重复,也不充许找不一个满足要求的表。
还在研究中。
教你在SQL Server 2000数据库中使用分区分区视图联接来自一组成员的水平分区数据,使数据看起来象来自同一张表。
SQL Server 2000 区分本地分区视图和分布式分区视图。
在本地分区视图中,所有相关表和视图驻留在SQL Server 的同一实例上。
在分布式分区视图中,相关表中至少有一张表驻留在其他某个(远程)服务器上。
建议您不要将分布式分区视图用于数据仓库应用程序。
矢量数据仓库围绕事实(标量)和矢量构建,从物理上通常表示为星形架构和雪花形架构,极少有同时包含事实和矢量的完全非正交化的平面表。
由于矢量架构是最常见的关系型数据仓库结构,本文集中讨论这类架构的分区。
下面的建议也适用于其他通用数据仓库架构。
分区的优点数据修剪:许多数据仓库管理员会定期将陈旧的数据归档。
例如,一个单击流数据仓库可能只将详细数据联机保留三至四个月。
其他常见的规则可能是联机保留13 个月、37 个月或10 年,当旧数据不在活动窗口中时就归档并从数据库中删除。
这种滚动窗口结构是大数据仓库通常采取的做法。
在没有分区表的情况下,从数据库中删除旧数据的进程需要一个很大的DELETE 语句,例如:DELETE FROM fact_tableWHERE date_key < 19990101执行该语句开销会非常大,可能比同一张表的加载进程需要更多的时间。