SQLSERVER里可以把一个库的不同的表放置到不同的服务器来减轻压力吗?
比如说,我的一个数据库DB里面有很多个大表,并且并发访问很大。
我有这样一个想法来减轻压力,不知道能不能实现。
现在同一个局域网里,我有很多台服务器,我可以做到把这个DB数据库的表分散到其他服务器里,而不拆分这个DB数据库吗?从而达到当查询相关表时,主要消耗表所在服务器的性能,而不影响DB数据库所在的服务器,而T-SQL查询方式不变。
这个方案能实现吗?求高手解答!!!

解决方案 »

  1.   

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

  2.   

    就拿用户表UserTalbe来说吧,我现在针对用户表主键UserName(该主键可以包含中文的,分表算法比较复杂)来进行分表的。这个表一共就分了100个子表,每个子表名字格式为UserTalbe_n(n代表数字)。我想把这些分开的子表分表放到不同的服务器里,请问怎么实现?
      

  3.   

    我的QQ:236707608,求高手能加我QQ给我指点一下,非常感谢!