为什么要分配表:
为了改善大型表的可伸缩性和可管理性。
当在多个表或服务器上分割数据时,因为需扫描的数据较少,所以只访问一部分数据的查询运行得较快。如果表位于不同的服务器或一台多处理器的计算机上,同样可以对查询所涉及的表进行同时扫描,从而改进查询的性能。此外,象索引重建或表备份这样的维护任务可更快地执行。
分区带来帮助:
当表和索引变得非常大时,分区可以将数分为更小,更容易管理的部分,从而提供一定的帮助。
如果具有多个CPU的系统中存在一个大型表,则对该表的分区可以通过并行操作获得更好的性能。
SQL SERVER 2000中的分区视图:
在SQL server 2000中,数据修改语句可以受益于视图功能,由于修改语句可以使用相同的分区视图结构,因此,SQL SERVER 可以通过视图将修改定向至相应的基础表。
允许在多个服务器之间分布这些视图,并直接通过视图更新数据库表。
SQL SERVER 2000 中的分区视图:
SQL SERVER 2000区分本地视图和分布式视图。在本地分区视图中,所有的参与表和视图驻留在同一SQL SERVER实例上。在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。
创建基本步骤:
1、 在实现分区视图之前,必须先水平分区表。原始表初分成若干个较小的成员表。每个成员表包含与原始表相同数量的列。
2、 成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。键值范围基于分区列中的数据值,每一成员中的值范围通过分区列上的CHECK约束强制,并且范围之间不能重叠。
3、 在创建成员表后,在服务器上定义一个分区视图。
创建事例:
//ServerA
Use pubs
go
Create 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')
)
//Server B
use pubs
go
Create 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
//ServerA
exec sp_addlinkedserver
@server='DPVSERVER1', @srvproduct='',
@provider='SQLOLEDB', @datasrc='ServerB'
go
exec sp_addlinkedsrvlogin
@rmtsrvname = 'DPVSERVER1'
, @useself = 'false'
, @rmtuser = 'sa'
, @rmtpassword = 'password'
go
//ServerB
exec sp_addlinkedserver
@server='DPVSERVER2', @srvproduct='',
@provider='SQLOLEDB', @datasrc='ServerA'
exec sp_addlinkedsrvlogin
@rmtsrvname = 'DPVSERVER2'
, @useself = 'false'
, @rmtuser = 'sa'
, @rmtpassword = 'password'
go
//ServerA
Exec sp_serveroption 'DPVSERVER1', 'lazy schema validation', 'true'
//Sever B
Exec sp_serveroption 'DPVSERVER2', 'lazy schema validation', 'true'
//Server A:
Create view DPV_Customers As
Select * from Customers
Union all
Select * from DPVSERVER1.Pubs.dbo.Customers
//Server B
Create view DPV_Customers As
Select * from DPVSERVER2.Pubs.dbo.Customers
UNION ALL
Select * from Customers
set xact_abort on
INSERT 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'
Sql SERVER 2005的分区功能增强:
Sql server 2000中并没有简化分区管理、设计。而且分区数目增加,查询优化时间上升。
SQL SERVER 2005中的分区表:
SQL 2005提供了在数据库中的文件组之间表分区的功能,水平分区允许氢表按分区scheme分为多个小的组。表分区用于非常大的,从几百GB到TB甚至更大的数据库。
通过SQL 2005中的分区表,可以对表进行设计(使用函数和架构),从而将具有相同分区键的所有行都直接放置到(且总是转到)特定的位置。函数用于定义分区边界以及放第一个值的分区。在使用LEFT分区函数时,第一个值将作为第一个分区中的上边界,在使用RIGHT分区函数时,第一个值将作为第二个分区的下边界,定义函数后即可创建分区架构,分区架构可以将对象映射到一个或多个文件组。为了确定数据的相应物理位置,分区架构将使用了分区函数。根据表分区架构创建表。
alter database adventureWorks add filegroup [fg1]
go
alter database adventureWorks add filegroup [fg2]
go
alter database adventureWorks add filegroup [fg3]
go
alter database adventureWorks
add file
(name='fg1',
filename='c:"fg1.ndf',
size=5mb)
to filegroup [fg1]
go
alter database adventureWorks
add file
(name='fg2',
filename='d:"fg2.ndf',
size=5mb)
to filegroup [fg2]
go
alter database adventureWorks
add file
(name='fg3',
filename='e:"fg3.ndf',
size=5mb)
to filegroup [fg3]
go
use adventureWorks
go
Create partition function emailPF(nvarchar(50)) as range right for
values ('G','N')--创建分区函数,A-F"G-N"M-Z
go
Create partition scheme emailPS as partition emailPF to (fg1,fg2,fg3)--
创建分区架构
go
Create table customermail (custid int, email nvarchar(50)) on emailPS
(email)--创建分区表
go
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-591579/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/16436858/viewspace-591579/